Ori*_*ood 24 c linux terminal daemon
当我尝试使用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);
Run Code Online (Sandbox Code Playgroud)
我的问题是:是否有必要进行上述操作?
pil*_*row 14
另一个答案是明确的,技术上是正确的(所以我相应地投了票).
另一个答案是: "不,不要编写守护自己的代码."
而是使用一个过程监督框架(如daemontools或runit或launchd)来处理这个问题.
传统的UNIX服务器是自我守护的,因此可以解决许多问题:当前工作目录,进程组和会话独立性,信号掩码和处置,文件系统root,特权,umask,打开文件描述符等.
但是,大多数或所有这些进程属性都是在一个进程中继承的exec()
,这意味着服务器进程通常可以"生成"所需的进程组,工作目录,根目录等.尽管你们需要自己做所有事情. ll通常仍然需要自己管理特权操作和特权撤销.
(实际上,我认为编写自我守护程序存在长期风险.锅炉板"后台"程序被复制和粘贴并匆忙移植和扩展,程序员花时间在辅助代码上而不是程序的主要目的上. )