Chinaunix首页 | 论坛 | 博客
  • 博客访问: 249773
  • 博文数量: 51
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 575
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-22 13:49
文章分类
文章存档

2009年(1)

2008年(13)

2007年(7)

2006年(30)

我的朋友

分类:

2006-12-29 00:01:58

守护进程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的权限的干扰:

umask(0)


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) |
给主人留下些什么吧!~~