我们的生产代码中存在一个长期存在的错误。这本质上是一个基于套接字的守护进程。它使用 select 监听一堆文件描述符。
偶尔(大约一天一次),select 将返回 EBADF。
我已经编写了代码来搜索错误的文件描述符,它循环遍历每个 fd 并在其上调用 select。这些调用从不返回 EBADF。我也试过 fstat。他们也从不返回 EBADF。
我还重写了守护进程以使用轮询。这没有帮助。
有人有其他想法吗? (除了我犯了一个愚蠢的错误,使用 select 很容易做到这一点)。
最佳答案
select
很可能是在关闭的文件描述符上调用的。
通常的来源是重用 fd_set
而不重新初始化它。
你在信号处理程序中有什么进展吗? (比如在 HUP 上重新打开日志文件?)
关于c - 选择 EBADF : which FD is bad?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/883282/