在我的应用程序中,当警报触发时,我将一个整数从信号处理程序写入管道。在我的主应用程序中,我永远在 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
}