在C中将数据从父进程发送到子进程,反之亦然

时间:2010-01-31 14:37:19

标签: c process fork parent

我创建了一个程序,在循环中创建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(...)之前完成。


我不确定这个解释是否足够,所以我可以用文字制作一个小图片:)

现在就是这样:

  • 父母 - >管道
  • 管道 - >儿童过程1
  • 管道 - >儿童过程2
  • 管道 - > ...
  • 管道 - >儿童过程5

我希望它像这样。

  • 父母 - >管道
  • 管道 - >儿童过程1
  • 管道 - >儿童过程2
  • 管道 - > ...
  • 管道 - >儿童过程5
  • 子进程1 - >父
  • 子进程2 - >父
  • ...
  • 子进程5 - >父

感谢您的帮助!

4 个答案:

答案 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。