当我试着写用C在linux下一个守护进程,我被告知我应该后叉代码块中添加以下代码:编写Linux守护进程时,为什么必须从tty中分离出来?
/* 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服务器,您不会期望会话中的随后的警告输出。 – 2012-01-08 12:48:11
@JohnChadwick你说的确实是你在转换成守护进程时想要做的事情之一,但是通过关闭stdin,stdout和stderr来实现这一点。您从终端上分离以避免某些信号(请参阅下面的答案)。 – 2012-01-08 13:01:22
你可以“不接受”我的回答并接受@ AdamZalcman的代替吗?他比我做得好得多。他对setsid()完全正确,你应该使用它。 – fge 2012-01-08 13:05:55