如何制作一个进程守护进程

我想了解如何使我的程序成为一个守护进程。所以我碰到的一些事情是一般来说,一个程序执行以下步骤来成为一个守护进程:

  1. 调用fork( )
  2. 在父亲中,调用exit( ) 。 这可以确保原始父节点(守护进程的祖父节点)满足其子节点终止,节点守护进程的父节点不再运行,守护进程不是进程组节点。 最后一点是成功完成下一步的要求。

  3. 调用setsid( ) ,为守护进程提供一个新的进程组和会话,两者都以它作为领导者。 这也确保该过程没有关联的控制terminal(因为该过程刚创build了新的会话,并且不会分配一个)。

  4. 通过chdir( )将工作目录更改为根目录。 这是因为inheritance的工作目录可以在文件系统的任何地方。 守护进程倾向于在系统的正常运行时间内运行,并且您不希望保持某个随机目录处于打开状态,从而阻止pipe理员卸载包含该目录的文件系统。

  5. closures所有文件描述符。

  6. 打开文件描述符0,1和2(标准input,标准输出和标准错误)并将其redirect到/dev/null
 #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <linux/fs.h> int main (void) { pid_t pid; int i; /* create new process */ pid = fork ( ); if (pid == -1) return -1; else if (pid != 0) exit (EXIT_SUCCESS); /* create new session and process group */ if (setsid ( ) == -1) return -1; /* set the working directory to the root directory */ if (chdir ("/") == -1) return -1; /* close all open files--NR_OPEN is overkill, but works */ for (i = 0; i < NR_OPEN; i++) close (i); /* redirect fd's 0,1,2 to /dev/null */ open ("/dev/null", O_RDWR); /* stdin */ dup (0); /* stdout */ dup (0); /* stderror */ /* do its daemon thing... */ return 0; } 

有人可以给我一个像Apache这样的程序的现有源代码的链接,以便我可以更深入地了解这个过程。

如果你正在寻找一个干净的方法,请考虑使用标准的api- int daemon(int nochdir, int noclose); 。 手册页非常简单,自我解释。 手册页 。 经过良好testing的api远远超过了我们自己的可移植性和稳定性的实现。