C-同时从两个管道(两个子进程的父进程)读取?

C-同时从两个管道(两个子进程的父进程)读取?,c,pipe,file-descriptor,C,Pipe,File Descriptor,我有一个父进程,它有两个子进程。我已经创建了两个管道(每个孩子一个)。对于每个管道,我都关闭了父管道的写入端和子管道的读取端 我遇到的问题是让家长同时读取每个子管道。它似乎只是从我试图读取的第一个管道读取 //PARENT while(1) { read(fd[0], buffer, sizeof(buffer)); //print out buffer read(fd2[0], buffer2, sizeof(buffer2)); //print out buf

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

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

//PARENT
while(1)
{
    read(fd[0], buffer, sizeof(buffer));
    //print out buffer
    read(fd2[0], buffer2, sizeof(buffer2));
    //print out buffer2
}
打印的唯一内容是我第一次读取呼叫的信息。我的结论是,阅读似乎阻碍了其他阅读。我在网上查了一下,在select中找到了一个可能的解决方案,但没有弄清楚如何用管道实现它(似乎在任何地方都没有任何例子)


有人能解释一下select是如何与管道一起工作的,或者告诉我任何其他可能解决我问题的方法吗?

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

您需要使管道无阻塞(使用
fcntl(fd[0],F_SETFL,O_NONBLOCK);
)或使用螺纹

编辑添加Jonathan Leffler的观点:

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

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

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

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

您需要使管道无阻塞(使用
fcntl(fd[0],F_SETFL,O_NONBLOCK);
)或使用螺纹

编辑添加Jonathan Leffler的观点:

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

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

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

请阅读您的系统文档以了解选择。(
人工选择
)。许多精选手册页都有相当丰富的示例。您的大纲代码将同步读取来自一个孩子和另一个孩子的消息。我相信
buffer2
的大小与
buffer
的大小相同,因为您第二次读取时也使用了
buffer
的大小。请阅读您的系统文档进行选择。(
人工选择
)。许多精选手册页都有相当丰富的示例。您的大纲代码将同步读取来自一个孩子和另一个孩子的消息。我相信
buffer2
的大小与
buffer
的大小相同,因为您在第二次读取时也使用了
buffer
的大小;使用
select()
或其变体可能会更好。设置O_NONBLOCK可能会导致繁忙的轮询;使用
select()
或其变体可能会更好。