我知道如何监控两个文件描述符,但是 4 或 5 个文件描述符呢?
这是我使用 2 个文件描述符的方法。
fd_mon = (fd1 > fd2 ? fd1 : fd2) + 1;
select(fd_mon, &readfds, NULL, NULL, NULL);
如何监控 3 个或更多文件描述符?
使用FD_SET
宏将文件描述符添加到您要传递到的集合中select
。你也需要它的FD_ZERO
伙伴。在上述情况下,只需为每个文件描述符和相同的集合继续调用 FD_SET 。FD_ISSET
FD_CLR
谷歌——“ man select ”,它甚至有一个例子!我不知道你对*NIX 有多熟悉,但是man
(manual 的缩写)是内置在操作系统中的帮助系统。它会经常回答这些关于系统调用的问题。您可能必须在某些发行版中安装它,例如,我认为 Ubuntu 并没有默认安装所有开发手册页。
您可以在打开每个描述符后进行测试:
max_fd = 0;
fd = open(...);
if (fd > max_fd) {
max_fd = fd;
}
....
select(max_fd+1, &readfds, NULL, NULL, NULL);
(fd1 < fd2 ? fd1 : fd2) < fd3 ? (fd1 < fd2 ? fd1 : fd2) : fd3;
它适用于 3 个变量,您可以将其用于尽可能多的变量
您可以将描述符粘贴在数组中:
for(i = maxfd = 0; i < nfds; i++) {
if(maxfd < fd[i]) maxfd = fd[i];
FD_SET(...);
}
select(maxfd+1, ...);