守护进程可以用STDOUT启动外部进程吗?

时间:2017-10-24 16:46:37

标签: c linux daemon

这是一个特定于Linux的问题。

当守护程序应用程序启动时,它通常会关闭其标准流(STDOUT,STERR和STDIN)。

我的守护程序应用程序需要启动外部应用程序,可能会将消息打印到我需要捕获的STDOUT。

似乎这个子应用程序没有获得STDOUT,因为守护进程没有。启动外部应用程序并在此环境中为其提供STDOUT的方法是什么?

我是否必须关闭守护进程STDOUT才能运行外部应用程序?

1 个答案:

答案 0 :(得分:1)

守护进程通过fork()创建子进程;子进程从其父进程继承所有文件描述符(不是close-on-exec)。

如果您希望守护进程从子进程接收stdout,则需要将其文件描述符1(fileno(stdout))指向守护进程可以看到的位置。最简单的是一个套接字,但你也可以使用一个文件。

一些代码(我没有编译,但大致正确,应该让你顺利):

// run the passed-in command in a process, returning a read file 
// descriptor that will read its stdout
static int
spawn (const char * const cmd)
{
    int comlink[2];
    pid_t pid;

    if (pipe(comlink)) {
        // handle error
    }
    if ((pid = fork()) == -1) {
        // handle error
    }
    if (pid == 0) {
        // the child
        if (dup2(comlink[1], fileno(stdout))) {
            // handle error
        }
        close(comlink[0]);
        close(comlink[1]);
        execl(...);  // get cmd into some exec format and put it here
        _exit(-1);   // should never be reached
    } else {
        // the parent
        close(comlink[1]);
        return comlink[0];
    }
}