【发布时间】:2012-02-05 08:22:58
【问题描述】:
当我尝试在 linux 下使用 C 编写守护程序时,有人告诉我应该在 fork 代码块之后添加以下代码:
/* Preparations */
...
/* Fork a new process */
pid_t cpid = fork();
if (cpid == -1){perror("fork");exit(1);}
if (cpid > 0){exit(0);}
/* WHY detach from tty ? */
int fd = open("/dev/tty", O_RDWR);
ioctl(fd, TIOCNOTTY, NULL);
/* Why set PGID as current PID ? */
setpgid(getpid(), 0);
我的问题是: 以上操作是不是一定要做?
【问题讨论】:
-
我认为部分原因是守护进程不应该写入输出或读取输入。如果你要开始,例如SSH 会话上的 HTTP 服务器,您不会期望稍后在会话中输出随机警告。
-
@JohnChadwick 您所说的确实是您在转换为守护程序时想要做的事情之一,但是您可以通过关闭 stdin、stdout 和 stderr 来实现。您从终端分离以避免某些信号(请参阅下面的答案)。
-
你能“不接受”我的回答并接受@AdamZalcman 的回答吗?他做得比我好得多。他对 setsid() 的看法是完全正确的,你应该使用它。
-
@AdamZalcman 哦,对了,我实际上忘记了关闭 std*。我在考虑更改进程组 ID 会阻止所有相关信号,但这会变得不那么有意义,至少在 SIGHUP 的情况下。