守护进程daemon是系统里面一种特殊的进程。它没有与标准IO交互的shell接口,父进程是init,它将在系统中永久驻留直到被强行中止,例如收到kill的信号。典型的守护进程随系统的启动而启动,随系统的停止而停止。
创建一个工作良好的守护进程需要做以下工作:
1、执行fork(),并使父进程退出,使得子进程成为一个被init接管的孤儿进程;
pid = fork();
if (pid < 0)
{
perror("fork");
exit(EXIT_FAILURE);
}
if (pid > 0)
exit(EXIT_SUCCESS);
|
2、使用setsid()创建新的会话;
if (sid = setsid() < 0)
perror("setsid");
|
3、使用chdir()把根目录设置为当前的工作目录;
if (chdir("/") < 0)
perror("chdir");
|
4、清除umask,避免守护进程受到继承的umask的权限的干扰:
5、关闭不需要的文件描述符;
close(STDOUT_FILENO);
close(STDIN_FILENO);
close(STDERR_FILENO);
|
6、可能还需要读取配置文件。一般使用一个宏来定义配置文件的路径。然后使用一个单独的函数对配置文件进行处理。
例如
#define RCFILE "/etc/myprocd.conf"
|
完成上面工作,需要包含的头文件包括stdio.h, stdlib.h, errno.h, unistd.h等。
做完上述工作,这个守护进程就可以开始做其它相关处理了。
由于守护进程没有标准输入输出,运行产生的相关有用信息可以使用一系列的syslog调用,设置LOG_DAEMON功能标志可以将守护进程myprocd写入到/var/log/myprocd.log里。
要注意对kill信号的处理,如SIGHUP, SIGCHLD等。例如,最好在上面的第二步的时候阻塞掉SIGHUP以避免收到此信号导致进程重启。相关工作处理完毕再重新部署相关的未决信号。
阅读(1419) | 评论(0) | 转发(0) |