2012-10-01 73 views
0

我有一个父进程,它有两个子进程fork掉。我创建了两个管道(每个孩子一个)。对于每个管道,我已经关闭了父节点的写入结束和子节点的读取结束。C - 从两个管道(两个子进程的父节点)同时读取?

我遇到的问题是让父母同时从每个子管道读取。它似乎只是从我尝试读取的第一个管道读取。

//PARENT 
while(1) 
{ 
    read(fd[0], buffer, sizeof(buffer)); 
    //print out buffer 
    read(fd2[0], buffer2, sizeof(buffer2)); 
    //print out buffer2 
} 

打印的唯一信息是来自我第一次读取的电话的信息。我认为阅读似乎阻止了其他阅读。我在网上查找并找到了一个可能的解决方案,但无法弄清楚如何使用管道来实现它(似乎没有任何地方的例子)。

有人可以解释如何选择与管道工作或通知我的任何其他可能的解决方案,我的问题?

+0

请阅读您的系统文档以选择。 ('人选')。许多精选的手册页都有很多实例。 –

+0

你的大纲代码将同步阅读来自一个孩子和另一个孩子的消息。我相信'buffer2'与'buffer'的大小是一样的,因为你也使用'buffer'的大小来进行第二次读取。 –

回答

2

您的阅读被阻止。这意味着当你调用read时,它会等待,直到它有你请求的字节数或流被关闭(命中EOF)。

您可能需要使管道非阻塞(使用fcntl(fd[0], F_SETFL, O_NONBLOCK);)或使用线程。

编辑添加乔纳森莱弗勒的观点:

如果使用非阻塞这将是最有效的调用select()。这将节省您浪费大量CPU时间(这是在启用非阻塞时发生的情况,因为当没有数据存在时读取会立即返回)。例如:

int fds[2]; 
... 
fds[0] = fd[0]; 
fds[1] = fd2[0]; 

while... 
    select(2, &fds, NULL, NULL, NULL); 
    read(...); 
    read(...); 
+1

设置O_NONBLOCK可能导致忙轮询;使用'select()'或其一个变体可能会更好。 –

相关问题