在我的应用程序中,当警报触发时,我从信号处理程序向管道写入一个整数。 在我的主应用程序中,我永远循环select()0超时值。 问题是信号处理程序成功写入管道的写入端,但是选择NEVER表示管道读取端的可读性。因此在下面的伪代码中,select的返回值将为0。 甚至更多的预复制是如果我删除选择并只是做一个阻塞读(),它的工作原理!我可以读取处理程序写的整数。只是选择总是认为管道的读取端不可读,因此总是返回0.
所以pseduo代码看起来像
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
}
答案 0 :(得分:6)
select
函数将修改设置和超时。您必须重新初始化描述符集并在select
调用之前超时循环的每次迭代。
此外,您不应该使用if (x == 1)
,而是使用if (FD_ISSET(some_fd, &readfd))
。请记住,maxfd
应该是任何集合中使用的最大文件描述符加一个。
答案 1 :(得分:1)
select
适用于fd_set
。您似乎正在尝试将指针传递给描述符(int)以进行选择?
我建议您查阅select
和fd_set
的手册页: