是否可以将子进程的标准输出重定向到父进程中的另一个文件?

时间:2018-08-30 03:06:01

标签: c++ linux

子进程运行bin文件,该文件由Qualcomm提供。 子进程由我开发的父进程调用。 当子进程运行时,它总是在shell命令中打印很多日志。 因此,我能够将高通公司的外流从标准输出重定向到父进程中的另一个文件吗? 如您所知,推送高通更新此bin文件几乎是不可能的。 非常感谢〜

3 个答案:

答案 0 :(得分:2)

这里的关键是POSIX函数dup2,该函数实际上使您可以将一个文件描述符替换为另一个文件描述符。而且,如果您使用[FallbackRoute](而不是fork),则实际上可以控制子进程在systemfork之间的加载另一个可执行文件的过程。< / p>

exec*

答案 1 :(得分:1)

对于POSIX,这是可能的,因为POSIX Shell可以这样做。对于POSIX,执行程序有两个步骤。首先使用fork克隆父进程以创建子进程。然后,让子进程使用exec系列系统调用之一来执行所选程序,而不是父程序。在这两个步骤之间,为子进程执行的代码可以执行其他操作,这将影响要执行的程序的环境。特别是,该代码可以打开要重定向到的文件的文件描述符,关闭stdout文件描述符,然后将文件的文件描述符复制到用于stdout的值(1)。

答案 2 :(得分:0)

您可以创建自己的管道并将其附加到子进程。

  1. 创建3个管道。他们将替换孩子的stdin,stdout,stderr。
  2. fork()
  3. 在子流程close()中,管道的父端。关闭stdin,stdout和stderr。
  4. 父进程close()管道的子端。
  5. dup2()管道在子进程中结束,该子进程旨在用作新的stdin,out,err
  6. exec()这个孩子。

现在,您已经从子级到父级中的管道获得了所有输出。当然,您需要读取来自子进程的管道,否则它将在对stdout / stderr的任何写入操作中阻塞。为此,您可以使用select()poll()epoll()多路复用算法。

请参见

https://linux.die.net/man/2/pipe

https://linux.die.net/man/2/dup2

https://linux.die.net/man/2/execve

https://linux.die.net/man/2/fork