我有一个父进程,其中有两个子进程从中分离出来。我创造了两个管道(每个孩子一个)。对于每个管道,我已经关闭了父项的写入结束和子项的读取结束。
我遇到的问题是让父母同时从每个子管读取。它似乎只是从我尝试读取的第一个管道读取。
//PARENT
while(1)
{
read(fd[0], buffer, sizeof(buffer));
//print out buffer
read(fd2[0], buffer2, sizeof(buffer2));
//print out buffer2
}
唯一打印的是我第一次阅读电话的信息。我的结论是,读取似乎阻止了另一个读取。我已经在网上找到了一个可能的选择解决方案,但无法弄清楚如何用管道实现它(似乎没有任何例子)。
有人可以解释一下选择如何与管道一起工作或通知我任何其他可能解决我的问题的方法吗?
答案 0 :(得分:3)
你的阅读是封锁的。这意味着当你调用read时,它会一直等到你要求的字节数或者流被关闭(点击EOF)。
您需要使管道无阻塞(使用fcntl(fd[0], F_SETFL, O_NONBLOCK);
)或使用线程。
编辑添加Jonathan Leffler的观点:
如果您使用非阻止,则最有效的方式是调用select()。这将节省您浪费大量CPU时间(这是启用非阻塞时会发生的情况,因为读取将在没有数据时立即返回)。例如:
int fds[2];
...
fds[0] = fd[0];
fds[1] = fd2[0];
while...
select(2, &fds, NULL, NULL, NULL);
read(...);
read(...);