#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
#include <syslog.h>
#define MAXFD 64
void daemon_init(const char *pname, int facility)
{
int i:
pid_t pid;
/* fork,终止父进程 */
if (pid=fork())
exit(0);
/* 第一子进程 */
setsid();
signal(SIGHUP,SIG_IGN);
/* fork,终止第一子进程 */
if (pid=fork())
exit(0);
/* 第二子进程 */
daemon_proc=1;
/* 将工作目录设定为"/" */
chdir("/");
/* 清除文件掩码 */
umask(0);
/* 关闭所有文件句柄 */
for (i=0;i<MAXFD;i++)
{
close(i);
}
/* 打开log */
openlog(pname,LOG_PID,facility);
}
1.fork
首先需要fork 一个子进程并将父进程关闭。如果进程是作为一个shell 命令在命令行上前台启动的,当父进程终止时,shell 就认为该命令已经结束。这样子进程就自动成为了后
台进程。而且,子进程从父进程那里继承了组标识符同时又拥有了自己的进程标识符,这样保证了子进程不会是一个进程组的首进程。这一点是下一步setsid 所必须的。
2.setsid
setsid()调用创建了一个新的进程组,调用进程成为了该进程组的首进程。这样,就使该进程脱离了原来的终端,成为了独立于终端外的进程。
3.忽略SIGHUP 信号,重新fork
这样使进程不在是进程组的首进程,可以防止在某些情况下进程意外的打开终端而重新与终端发生联系。
4.改变工作目录,清除文件掩码改变工作目录主要是为了切断进程与原有文件系统的联系。并且保证无论从什么地方启动进程都能正常的工作。清除文件掩码是为了消除进程自 身掩码对其创建文件的影响。
5.关闭全部已打开的文件句柄这是为了防止子进程继承了在父进程中打开的文件而使这些文件始终保持打开从而产生某些冲突。
6.打开log 系统
以上就是建立一个守护进程的基本步骤。当然,一个实际的守护进程要比这个例子复杂许多,但是万变不离其宗,原理都是相同的。通过上面几步,我们可以正确的建立自己
的守护进程。
微信扫一扫,订阅我的博客动态^_^