我对选择和管道有疑问。我正在尝试创建 3 个子进程,每个子进程都有一个管道将消息发送到父进程。我正在使用
select()
检查是否有任何 fd 准备好。我的问题是我总是从 select()
得到非零返回值,所以我的循环不会终止。有人可以帮我弄这个吗?谢谢。 int pps[3][3]; //pipes
int highestFD=-1;
fd_set read_set;
for (i = 0;i<3;i++) {
if(pipe(pps[i]) != 0) {
exit(1);
}
int ret= fork();
if (ret== 0) {
close(STDOUT_FILENO);
close(pps[i][0]);
dup2(pps[i][1], 1);
write(1, "something", 100);
exit(0); //child process exit
}
if (ret > 0) {
close(pps[i][1]);
if (pps[i][0] > highestFD)
highestFD = pps[i][0];
}
}
while(1) {
FD_ZERO(&read_set);
for (i = 0;i<3;i++) {
FD_SET(pps[i][0], &read_set);
}
changedCount = 0;
changedCount = select(highestFD+1, &read_set, NULL, NULL, NULL);
if (changedCount <= 0) {
printf("exit");
break;
}
else {
for (i = 0;i<3;i++) {
if (FD_ISSET(pps[i][0], &read_set)) {
int rc = read(pipes[i][0], buffer, 100);
if (rc > 0) {
printf("%s\n",buffer);
memset(buffer, 0, 100);
}
}
}
}
来自
select()
的手册页
RETURN VALUE
On success, select() and pselect() return the number of file descrip‐
tors contained in the three returned descriptor sets (that is, the
total number of bits that are set in readfds, writefds, exceptfds)
which may be zero if the timeout expires before anything interesting
happens. On error, -1 is returned, and errno is set appropriately; the
sets and timeout become undefined, so do not rely on their contents
after an error.
注意此声明:
“返回三个返回的描述符集中包含的文件描述符的数量”
其中(以及手册页的其余部分)说
因此,要返回零,关联的 fd 都不能输入任何数据,并且不会发生 I/O 错误。
那么为什么代码中的
select()
永远不会返回 0?
答案:因为只有发生超时时才能返回0,而发布的代码从未设置超时。