我们的生产代码中长期存在错误.这实际上是一个基于套接字的守护进程.它使用select来监听一堆文件描述符.
偶尔(每天一次),选择将返回与EBADF.
我写了代码来搜索不好的描述符,循环遍历每个fd并调用select.这些呼叫永远不会返回EBADF.我也试过fstat.他们也永远不会返回EBADF.
我还重写了守护进程以使用民意测验.这没有帮助
有没有人有其他想法? (除了我做了一个愚蠢的错误,这是很容易与选择).
解决方法
我同意詹姆斯使用poll(),您可以轻松地检查每个fd的回复.
即
struct pollfd fds[NUM_FDS]; int ret,i; ... ret = poll(fds,NUM_FDS,POLL_TIMEOUT); for (i = 0; i < NUM_FDS; i++) if (fds[i].revents & POLLHUP || fds[i].revents & POLLNVAL) ... do something ...
当然,你不会在现实世界中实现它,只是一个例子.我很久以前停止使用select(),poll()是一个更好的界面.你是正确的,它只是太容易拍摄自己的脚与select().