选择EBADF:哪个FD不好?

前端之家收集整理的这篇文章主要介绍了选择EBADF:哪个FD不好?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们的生产代码中长期存在错误.这实际上是一个基于套接字的守护进程.它使用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().

猜你在找的C&C++相关文章