我创建了一个程序,在循环中创建5个管道和fork 5进程。当每个子进程与另一个程序重叠时,我已设法将数据从父进程发送到每个子进程。每个循环都按以下方式完成
(的 parent.c ):
// Child process - reads from pipe
if (childpid == 0) {
dup2(fd[0], 0); // replace stdin with pipe input
execv("program", arguments);
} else { // Parent process - writes to pipe
write(fd[1], buffer, strlen(buffer)+1);
}
所以现在我可以通过从子程序用execv(...)执行的程序中读取STDIN_FILENO来获取从父级发送到管道的数据。
像这样( program.c ):
char *buffer = (char *)malloc(50);
read(STDIN_FILENO, buffer, 50);
我的问题是,如何将数据发送回父母?我想的是再次使用dup2替换stdout和管道输出,但我无法让它工作。我意识到这必须在至少使用execv(...)之前完成。
我不确定这个解释是否足够,所以我可以用文字制作一个小图片:)
现在就是这样:
我希望它像这样。
感谢您的帮助!
答案 0 :(得分:3)
管道是单向的,而不是双向的,因此通用的解决方案是为返回数据创建另外五个管道(gak!)。然后父母需要使用select()
系统调用来知道哪些返回管道已准备好读取数据。
哦,我会写的
dup2(fd[0], 0); // replace stdin with pipe input应该
dup2(fd[0], 0); // replace stdin with output from pipe反之亦然。
与其他回复一样,其他通信方法可能更合适,具体取决于您要实现的目标。
答案 1 :(得分:2)
在此处查看此unix programming faq,查看问题 1.4 1.5 ,可能使用内存映射来允许父/子进程从中读取/写入两端......有一个很好的指导来理解IPC here。
编辑:感谢 Trent 指出错字中的一小部分......我的意思是1.5 ...
希望这有帮助, 最好的祝福, 汤姆。
答案 2 :(得分:0)
我在网上看了一下。似乎您只能使用管道进行单向通信。这是有道理的 - 从stdin和输出到stdout的输入。如果要在父进程和子进程之间进行双向通信,请使用套接字。还有其他方法可以实现双向IPC。我建议您了解有关进程间通信的更多信息。
一切顺利。
答案 3 :(得分:0)
如果您想继续使用管道,那么为子级>父级通信创建一组FD,为父级>子级通信创建一组FD。因此,不要使用int fd [2],而是使用int toParent [2],toChild [2]。而不是dup2(fd [0],0),你有dup2(toChild [0],0); dup2(toParent [1],1)。
不要只是复制,而是关闭你不使用的FD。