2

在我的应用程序中,当警报触发时,我将一个整数从信号处理程序写入管道。在我的主应用程序中,我永远在 select() 上循环,超时值为 0。问题是信号处理程序成功地写入了管道的写入端,但选择从不显示管道读取端的可读性。所以在下面的伪代码中,select 的返回值将是 0。甚至更令人困惑的是,如果我删除 select 并简单地执行阻塞 read(),它就可以工作!!!我可以读取处理程序写入的整数。只是 select 总是认为管道的读取端不可读,因此总是返回 0。

所以伪代码看起来像

int x=0;
for(;;)
{

   x = select(maxfd, &readfd, NULL, NULL, &dontWait); // dontWait is timeval with tv_sec and tv_usec = 0
    if (x == 1)
     //check for read descriptor and do something
}
4

2 回答 2

6

select函数将修改集合和超时。select您必须在调用之前重新初始化描述符集并超时循环的每次迭代。

此外,您不应该真正使用if (x == 1),而应使用if (FD_ISSET(some_fd, &readfd)). 请记住,这maxfd应该是任何集合中使用的最大文件描述符加一

于 2012-12-10T06:52:22.813 回答
1

selectfd_sets 上工作。看来您正在尝试将指针传递给要选择的描述符(int)?

我建议查阅手册页selectfd_set

http://linux.die.net/man/3/fd_set

于 2012-12-10T06:53:22.060 回答