0

我有一个父进程,其中有两个子进程从中分叉。我创建了两个管道(每个孩子一个)。对于每个管道,我已经关闭了父级的写入端和子级的读取端。

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

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

唯一打印的是我第一次阅读电话的信息。我得出的结论是 read 似乎阻止了其他读取。我在网上查看并在 select 中找到了一个可能的解决方案,但无法弄清楚如何用管道实现它(似乎在任何地方都没有任何示例)。

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

4

1 回答 1

3

你的阅读被阻塞了。这意味着当您调用 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(...);
于 2012-10-01T22:38:42.753 回答