我有以下代码

fd = listen_socket(INADDR_ANY, CLIENT_PORT, client_config.interface);
fdr = raw_socket(client_config.ifindex);
if (fd >= 0) FD_SET(fd, &rfds);
if (fdr >= 0) FD_SET(fdr, &rfds);

max_fd = fd > fdr ? fd : fdr;
retval = select(max_fd + 1, &rfds, NULL, NULL, &tv);

if (FD_ISSET(fd, &rfds)) {
    ....
} else if (FD_ISSET(fdr, &rfds)) {
    ....
}

如果我们从fd套接字接收数据,FD_ISSET(fd, &rfds)是否返回true,FD_ISSET(fdr, &rfds)是否返回false?

最佳答案

POSIX standards reference page on select开始:
FD_ISSET(fd, fdsetp)如果文件描述符fd是fdsetp所指集合的成员,则应计算为非零,否则应计算为零。
因此,没有提到FD_ISSET的结果(实际上它不是一个函数,而是一个宏,在技术上它不会“返回”任何东西),只是它要么是零,要么是非零。
回答你的问题,是的。如果fd是可读的,那么FD_ISSET(fd, &rfds)将是非零(true)并且FD_ISSET(fdr, &rfds)将是零(false)(除非它也是可读的,所以不要在那里使用else if,两者都可能是true)。

10-07 18:35