2014-09-21 189 views
0

我正在使用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语言代码。 感谢你们

+1

这个问题几乎肯定存在重复。我用你的代码看到的问题是'select()'破坏了'readset',你不能恢复它,这意味着你在第二次迭代时会问一个不同的问题。另一个可能的问题是,如果你在文件描述符列表中有任何磁盘文件,它们总是可读的。请注意,'select()'返回可读描述符的数量,而不是(唯一)可读描述符的数量。您将需要展示如何构造'readset'以获得更多帮助。 – 2014-09-21 20:50:43

+0

请参阅[为什么'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

+0

select函数返回文件描述符的数量(来自readfds,writefds和errorfds的位数)。所以在你只有1个文件描述符的时候。 – Gasim 2014-09-21 21:00:55

回答

0

On success, select() and pselect() return the number of file descriptors contained in the three returned descriptor sets

因此,如果只有一个文件描述符触发事件(这是你的情况下),select()返回1及后select()回报,你readset因此只包含一个fd - 这引发了一个事件。

+0

是的,我仔细阅读文档,发现我误解了函数返回的内容。那么,是不是意味着,每次进入循环时,fd_set应该被清零,并且当某些事件被file_descriptors触发时,select()将返回fd的数量并将fd的数字放入fd_set中?但是,什么FD_SET()是为什么我们需要添加一个file_descriptor到fd_set? – user3788871 2014-09-21 21:08:25

+0

@ user3788871:no;你必须使用FD_SET()等来创建你想要select()来检查每个调用的描述符列表。当调用返回时,fd集包含可在不阻塞的情况下读取(在您的代码中)的描述符列表。所以,你必须在每次迭代时重置fd集。而且你不能合理地使用磁盘文件描述符。鉴于这部分误解,我已经将问题作为与每次迭代重置fd集的问题的重复来解决 - 似乎是最合适的。 – 2014-09-21 21:11:36