我很难弄清楚 select() 是如何与 UNIX 中的管道一起工作的。我已经多次扫描手册页,但我并不完全理解给定的定义。
通过阅读手册页,我的印象是 select() 会让系统等待,直到给定的文件描述符之一可以从管道中读取(在我的情况下)而不会阻塞。
这是我的一些大纲代码[编辑]:
int size, size2;
fd_set rfds;
struct timeval tv;
char buffer[100];
char buffer2[100];
int retval;
while(1)
{
FD_ZERO(&rfds);
FD_SET(fd[0], &rfds);
FD_SET(fd2[0], &rfds);
tv.tv_sec = 2;
tv.tv_usec = 0;
retval = select(2, &rfds, NULL, NULL, &tv); //2 seconds before timeout
if(retval == -1)
perror("Select failed.\n");
else if(retval)
{
size = read(fd[0], buffer, sizeof(buffer));
if(size > 0)
printf("Parent received from even: %s\n", buffer);
size2 = read(fd2[READ], buffer2, sizeof(buffer2));
if(size2 > 0)
printf("Parent received from odd: %s\n", buffer2);
}
else
printf("No data written to pipe in 2 last seconds.\n");
}
我这里有两个管道。两个子进程正在写入各自的管道,父进程必须同时读取它们。
作为测试,我在每个管道上写了一个小字符串。然后我尝试读入它们并防止用 select 阻塞。唯一打印出来的是偶数管中的字符串。它似乎仍在阻止。我感到很沮丧,因为我觉得我在手册页上遗漏了一些东西。有人可以告诉我我做错了什么吗?