一尘不染

为什么在编写Linux守护程序时必须从tty分离?

linux

当我尝试使用C在linux下编写守护程序时,被告知应在 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);

我的问题是:是否必须执行上述操作?


阅读 244

收藏
2020-06-07

共1个答案

一尘不染

您必须将守护进程与终端解除关联,以避免发送与终端操作相关的信号(例如终端会话结束时的SIGHUP以及可能的SIGTTIN和SIGTTOU)。

但是请注意,使用TIOCNOTTY与终端解除关联的方式ioctl已过时。您应该setsid()改用。

守护程序离开其原始进程组的原因是不接收发送到该组的信号。请注意,这setsid()还将您的流程置于其自己的流程组中。

2020-06-07