【问题标题】:Select() monitoring 3 or more file descriptorsSelect() 监控 3 个或更多文件描述符
【发布时间】:2012-11-07 19:01:58
【问题描述】:

我知道如何监控两个文件描述符,但是 4 或 5 个文件描述符呢?

这是我使用 2 个文件描述符的方法。

fd_mon = (fd1 > fd2 ? fd1 : fd2) + 1;

select(fd_mon, &readfds, NULL, NULL, NULL);

如何监控 3 个或更多文件描述符?

【问题讨论】:

  • 您如何设置readfds?设置readfds 时,应确定fd_mon 的值。
  • 我是这样做的 FD_SET()。所以我可以分配一个数字来选择说我有3个文件描述符我可以这样做吗.. select(3, &readfds, NULL,NULL,NULL); ?..谢谢,
  • 您应该考虑使用 poll(2) 而不是 select(2)。

标签: c linux


【解决方案1】:

使用FD_SET 宏将文件描述符添加到您传递给select 的集合中。你也需要它的朋友FD_ZEROFD_ISSETFD_CLR。在上述情况下,只需为每个文件描述符和相同的集合继续调用 FD_SET。

Google - “man select”,它甚至有一个例子!我不知道你对*NIX 有多熟悉,但man(manual 的缩写)是操作系统内置的帮助系统。它会经常回答这些关于系统调用的问题。您可能必须在某些发行版中安装它,例如,我认为 Ubuntu 没有默认安装所有开发手册页。

【讨论】:

    【解决方案2】:

    您可以在打开每个描述符后进行测试:

    max_fd = 0;
    
    fd = open(...);
    if (fd > max_fd) {
      max_fd = fd;
    }
    ....
    select(max_fd+1, &readfds, NULL, NULL, NULL);
    

    【讨论】:

      【解决方案3】:

      (fd1 < fd2 ? fd1 : fd2) < fd3 ? (fd1 < fd2 ? fd1 : fd2) : fd3;

      它适用于 3 个变量,您可以将其用于尽可能多的变量

      【讨论】:

      • fd_mon = fd1; if (fd2 > fd_mon) fd_mon = fd2; if (fd3 > fd_mon) fd_mon = fd3; 更容易理解(超过 5 行)并且更容易扩展。您甚至可以通过以下方式使其 100% 一致:fd_mon = -1; if (fd1 > fd_mon) fd_mon = fd1; ...
      • @demic0de - 最佳答案选择不佳,如果您需要选择超过 100 个文件描述符怎么办!?
      【解决方案4】:

      你可以把描述符放在一个数组中:

      for(i = maxfd = 0; i < nfds; i++) {
           if(maxfd < fd[i]) maxfd = fd[i];
           FD_SET(...);
       }
       select(maxfd+1, ...);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-27
        • 2013-03-23
        相关资源
        最近更新 更多