c - 如何将 child_process 的标准输出重定向到标准输出和文件

标签 c operating-system stdout child-process

<分区>

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

最佳答案

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

这是你要做的:

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

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

仅供引用,这就是世界上每个 shell 实现管道的方式 cat 文件 | grep 你好

关于c - 如何将 child_process 的标准输出重定向到标准输出和文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20789604/

相关文章:

python - 使用 os.execl() 重新加载时没有名为 'x' 的模块

operating-system - 中期调度程序

用于 C 输出的 Javascript 代码生成器?

c - C 中的管道 — 在我的程序中读取和写入

c - C 中的 MPI_Scatter 结构

c - 如何在函数中使用 realloc() 并访问值?

encoding - 操作系统如何知道文件的编码

python - 如何使用 StreamHandler 捕获记录器 stderr 上的输出?

php - 捕获/抑制来自 php exec 的所有输出,包括 stderr

python - 值错误: I/O operation on closed file error