我正在使用select()函数来侦听来自所有文件描述符(包括stdin)的事件。 select函数总是调用时间,但无论任何事件发生,无论FD触发事件时,select()函数总是返回1.c select()函数总是返回1
void startSelecting()
{
printf("ready! start listening all events\n");
int current;
while(is_running){
do{
current=select(1000,&readset,NULL,NULL,NULL);
}while(current==-1&&errno==EINTR);
printf("file descriptor %d has event\n",current);
processEvents(current);
}
}
所以,这就是,它总是打印“文件描述符1具有事件“... ... 而且,我正在实施C语言代码。 感谢你们
这个问题几乎肯定存在重复。我用你的代码看到的问题是'select()'破坏了'readset',你不能恢复它,这意味着你在第二次迭代时会问一个不同的问题。另一个可能的问题是,如果你在文件描述符列表中有任何磁盘文件,它们总是可读的。请注意,'select()'返回可读描述符的数量,而不是(唯一)可读描述符的数量。您将需要展示如何构造'readset'以获得更多帮助。 – 2014-09-21 20:50:43
请参阅[为什么'select()'在第一次超时后总是返回0?](http://stackoverflow.com/questions/3324078/why-select-always-return-0-after-the-first-timeout/3324123 #3324123)和[是否有任何平台在'fd_set'(对于'select()'或'pselect()')使用结构副本会导致问题?](http://stackoverflow.com/questions/2421672)。另外[如何在文件描述符上创建'select()'块]?(http://stackoverflow.com/questions/16944727/)和[是否需要重置'select()'系统调用之间的'fd_set' ?](http://stackoverflow.com/questions/4563577) – 2014-09-21 20:54:40
select函数返回文件描述符的数量(来自readfds,writefds和errorfds的位数)。所以在你只有1个文件描述符的时候。 – Gasim 2014-09-21 21:00:55