c select()函数始终返回1

c select()函数始终返回1,c,sockets,file-descriptor,C,Sockets,File Descriptor,我正在使用select函数来监听所有文件描述符(包括stdin)中的事件。select函数始终被及时调用,但无论发生了什么事件以及fd触发了什么事件,select函数始终返回1 void startSelecting() { printf("ready! start listening all events\n"); int current; while(is_running){ do{ curr

我正在使用select函数来监听所有文件描述符(包括stdin)中的事件。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返回1。select返回后,您的读取集因此只包含一个fd,即触发事件的fd。

几乎可以肯定这个问题的重复。我在代码中看到的问题是,select会破坏读集,而您不会恢复它,这意味着您在第二次迭代中会提出不同的问题。另一个可能的问题是,如果文件描述符列表中有任何磁盘文件,它们总是可读的。请注意,select返回可读描述符的数量,而不是唯一可读描述符的数量。您需要展示readset是如何构造的,以获得更多帮助。请参阅和。此外,select函数还返回文件描述符的数量readfds、writefds和errorfds的位数。因此,在目前的情况下,您只有1个文件描述符。是的,我仔细阅读了文档,发现我误解了函数返回的内容。那么,这是否意味着每次进入循环时,fd_集都应该归零,并且当文件_描述符触发某些事件时,select将返回fd的数量并将fd的数量放入fd_集中?但是FD_集的用途是什么,为什么我们需要在FD_集中添加一个文件描述符呢?@user3788871:no;您必须使用FD_SET etc来创建您希望在每次通话中检查的描述符列表。当调用返回时,fd集包含描述符列表,这些描述符可以在代码中读取而不会阻塞。因此,您必须在每次迭代时重置fd集。而且,您不能明智地将其用于磁盘文件描述符。考虑到这一部分的误解,我将这个问题作为一个重复的问题来结束,这个问题涉及在每次迭代中重置fd集的问题-这似乎是最合适的。