【发布时间】:2014-09-21 20:46:53
【问题描述】:
我正在使用 select() 函数来监听来自所有文件描述符(包括标准输入)的事件。 select函数总是及时调用,但是无论发生什么事件,无论fd触发什么事件,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的构造方式以获得更多帮助。 -
select 函数返回文件描述符的数量(来自 readfds、writefds 和 errorfds 的位数)。所以当时你只有 1 个文件描述符。
标签: c sockets file-descriptor