2

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

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

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

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

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

4

4 回答 4

2

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

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

于 2012-11-07T19:12:46.370 回答
1

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

max_fd = 0;

fd = open(...);
if (fd > max_fd) {
  max_fd = fd;
}
....
select(max_fd+1, &readfds, NULL, NULL, NULL);
于 2012-11-07T19:14:41.897 回答
0

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

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

于 2012-11-07T19:15:56.983 回答
0

您可以将描述符粘贴在数组中:

for(i = maxfd = 0; i < nfds; i++) {
     if(maxfd < fd[i]) maxfd = fd[i];
     FD_SET(...);
 }
 select(maxfd+1, ...);
于 2012-11-07T21:41:52.150 回答