【问题标题】:Reading stdout/stderr from an exec()'ed process in a daemon从守护进程中的 exec() 进程读取 stdout/stderr
【发布时间】:2016-12-21 22:45:21
【问题描述】:

我有一个守护进程,我需要在其中 fork()/exec() 一些新进程,然后读取子进程 stdout/stderr。

我的问题是父进程是一个守护进程,其中 stdout 和 stderr 已关闭。有没有办法做到这一点?我必须打开一个外壳吗?

int status;
pipe(pipefd_stdout);
pipe(pipefd_stderr);

pid_t pid = fork();
if (pid == 0)
{   
    close(pipefd_stdout[0]);    // close reading end in the child
    close(pipefd_stderr[0]);    // close reading end in the child

    dup2(pipefd_stdout[1], 1);  // send stdout to the pipe
    dup2(pipefd_stderr[1], 2);  // send stderr to the pipe

    execvpe(cmd, (char**)args, (char**)env);
}
else
{
    // parent ...

    waitpid(pid, &status, 0);

    close(pipefd_stderr[1]);  
    close(pipefd_stdout[1]);  
}

【问题讨论】:

  • “我必须打开一个 shell 吗?” 不需要,而是建立一个管道。
  • 我也有类似的问题。不幸的是,我不能按照您的建议使用管道,因为我正在使用 system() 函数。将stdout 重定向到临时文件是否正确?

标签: c++ c fork exec daemon


【解决方案1】:

无论如何,shell 在这里也无济于事。您需要使用pipe(),然后使用dup()(或类似的)和close()创建一个或多个管道(取决于您是否希望将stdout/stderr的输出合并到一个流中)以放置适当的文件描述符到位。对pipe() 的调用在fork() 之前,对dup()close() 的调用在之后。

【讨论】:

  • @devin:您没有关闭足够多的管道文件描述符。如果您dup()dup2() 是标准输入、标准输出或标准错误的管道,您应该基本上始终关闭管道的both 端。假设你应该这样做,直到你遇到不应该的情况——这不会很快发生。
  • 我关闭了父级的管道(见编辑)。有没有办法为孩子关闭它?我一直认为 exec() 除非出错,否则不会返回,所以我什至不知道该怎么做。
猜你喜欢
  • 2012-10-22
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
  • 2012-03-16
  • 2013-08-26
  • 1970-01-01
相关资源
最近更新 更多