当我尝试使用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);
我的问题是:是否必须执行上述操作?
您必须将守护进程与终端解除关联,以避免发送与终端操作相关的信号(例如终端会话结束时的SIGHUP以及可能的SIGTTIN和SIGTTOU)。
但是请注意,使用TIOCNOTTY与终端解除关联的方式ioctl已过时。您应该setsid()改用。
ioctl
setsid()
守护程序离开其原始进程组的原因是不接收发送到该组的信号。请注意,这setsid()还将您的流程置于其自己的流程组中。