如何将子进程的stdout重定向到stdout和文件

时间:2013-12-26 18:45:37

标签: c operating-system stdout child-process

在我的程序中,我使用fork和execvp来创建子进程。现在我想将childprocess的输出定向到stdout和当前目录中的文件。那怎么能实现呢?

2 个答案:

答案 0 :(得分:2)

你不能将一个文件描述符绑定到两个东西 - 没有办法让write(x, "hello world")写入std out和一个文件。相反,你必须有三个文件 - 孩子的标准输出fd,父母从中读取,父母的标准输出fd,父母的标准输出到文件。

这是你做的:

  • 父母将fd 0复制到其他fd(父母的标准输出需要移动到0以外的其他东西)。
  • Parent调用pipe()来创建一个管道,如果需要,使用dup2()将它放在fd 0上。
  • Parent打开要写入的输出文件。
  • 父母要求孩子。
  • 子进程继承父进程的开放FD,包括fd 0上的管道和打开的文件。
  • Child关闭输出文件的FD。
  • Child执行实际程序。
  • Child会像往常一样写入fd 0(恰好是父级创建的管道)。
  • Parent将从管道中读取并将写入已移动的FD以获取其std out,并且还将写入FD以获取输出文件。

从管道读取并写入stdout并且输出文件的循环必须运行,直到子项关闭管道末尾,因此您可能需要创建一个线程来在后台执行此操作。

仅供参考,这就是世界上每个shell实现管道ala cat file | grep hello

的方式

答案 1 :(得分:0)

你应该读一下select()系统调用,它可以用来将i / p或o / p指向多个文件描述符吗'man select'