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()
或其变体可能会更好。