在程序中调用守护进程(0,0)和启动程序在后台并重定向它的输出是否有区别?

时间:2010-06-03 14:31:57

标签: c linux

在程序'progX'的开头有以下代码是否有区别

if(daemon(0, 0) == -1)
{
    printf("daemon error: %s", strerror(errno));
}

或通过以下命令运行'progX':progX& 2> / dev / null 1> / dev / null 0> / dev / null

3 个答案:

答案 0 :(得分:5)

daemon()做了几件事:

  • 通过分叉,然后退出父母,将过程重新加入init。查看ps列表,您将看到守护进程归PID 1所有。
  • 致电setsid()
  • 将目录更改为/
  • 将标准输入,输出和错误重定向到/dev/null

您的重定向处理最后一个操作,但不处理其余操作。

答案 1 :(得分:1)

progX & 2>/dev/null 1>/dev/null 0>/dev/null

stdin(0)是一个输入。不输出。守护进程启动应该关闭0,1,2 - 实际上所有打开的文件描述符就在它从父进程中分离之后。所以我不明白你为什么要将来自守护进程启动的错误消息重定向到/ dev / null。

这样做会阻止您从ProgX获得的任何消息。只是在编写ProgX时运行它是一个更好的主意。

fprintf(stderr, "daemon error %s\n", strerror(errno));

可能会更好 - 错误转到stderr,printf输出到stdout。

答案 2 :(得分:0)

daemon chdirs to / 守护进程关闭所有fds

所以你需要

cd /
progX ....

它是相同的