这是一个特定于Linux的问题。
当守护程序应用程序启动时,它通常会关闭其标准流(STDOUT,STERR和STDIN)。
我的守护程序应用程序需要启动外部应用程序,可能会将消息打印到我需要捕获的STDOUT。
似乎这个子应用程序没有获得STDOUT,因为守护进程没有。启动外部应用程序并在此环境中为其提供STDOUT的方法是什么?
我是否必须关闭守护进程STDOUT才能运行外部应用程序?
答案 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];
}
}