【问题标题】:How to direct the stdout of a childprocess to both stdout and a file [duplicate]如何将子进程的标准输出重定向到标准输出和文件[重复]
【发布时间】:2013-12-26 18:45:36
【问题描述】:

在我的程序中,我使用 fork 和 execvp 创建一个子进程。现在我想将子进程的输出定向到标准输出和当前目录中的文件。那么如何实现呢?

【问题讨论】:

  • @ElliottFrisch dup2() 最好。
  • @uʍopǝpısdn 实际上,另一个问题是您可以修改要复制其输出的程序。在这种情况下,子进程可能不在我们的控制之下。
  • 子进程不继承描述符吗?
  • 您给子进程一个标准输出,父进程可以读取该标准输出,然后父进程既可以将数据写入文件,也可以将其写入自己的标准输出。

标签: c operating-system stdout child-process


【解决方案1】:

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

这就是你要做的:

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

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

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

【讨论】:

    【解决方案2】:

    您应该阅读有关 select() 系统调用的信息,该系统调用可用于将 i/p 或 o/p 定向到多个文件描述符 do 'man select'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 2022-12-14
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 2013-06-02
      • 1970-01-01
      相关资源
      最近更新 更多