【问题标题】:c select() function always return 1 [duplicate]c select() 函数总是返回 1 [重复]
【发布时间】: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 语言代码。 谢谢各位

【问题讨论】:

标签: c sockets file-descriptor


【解决方案1】:

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

因此,如果只有一个文件描述符触发事件(您的情况),select() 返回 1。select() 返回后,您的 readset 因此只包含一个 fd - 触发事件的那个.

【讨论】:

  • 是的,我仔细阅读文档,发现我误解了函数返回的内容。那么,是否意味着每次进入循环时,fd_set 都应该归零,当一些事件被 file_descriptors 触发时,select() 会返回 fd 的数量并将 fd 的数量放入 fd_set 中?但是FD_SET()是干什么用的,为什么要在fd_set中添加file_descriptor呢?
  • @user3788871:不;您必须使用 FD_SET() 等来创建您希望select() 检查每个调用的描述符列表。当调用返回时, fd 集包含可以读取(在您的代码中)而不会阻塞的描述符列表。因此,您必须在每次迭代时重置 fd 集。而且您不能将它与磁盘文件描述符一起使用。考虑到这部分的误解,我已经把这个问题作为一个重复的问题结束了,这个问题处理了在每次迭代中重置 fd 集的问题——这似乎是最合适的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多