Chinaunix首页 | 论坛 | 博客
  • 博客访问: 191955
  • 博文数量: 219
  • 博客积分: 1435
  • 博客等级: 中尉
  • 技术积分: 1388
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-17 09:27
文章分类

全部博文(219)

文章存档

2013年(2)

2012年(183)

2011年(34)

我的朋友

分类:

2012-08-22 17:32:18

原文地址:linux 守护进程 作者:wang_qiao_ying

1,简介
守护进程是一种后台运行并且独立于所有终端控制之外的进程。UNIX/Linux 系统通常许多的守护进程,它们执行着各种系统服务和管理的任务。
2,守护进程的建立
守护进程不合任何一个终端相关,启动它的方法有如下几种:
1,在启动脚本中启动
2,由其他进程启动,如inetd程序可以监听网络请求,启动相应的守护进程。
3,由cron定时启动
4,也可以由终端启动,一般用于测试,或者重启服务
3,错误输出
守护进程的错误输出不能输出到终端,由syslog()调用输出至系统的相应日志中。
4,守护进程的建立
1,fork
fork()一个新进程,并终止父进程,这样子进程就成了后台进程,并保证其不是一个进程组的首进程。
2,setsid
然后setsid()创建一个新的进程组,并成为此进程组的首进程,此子进程完全脱离了与原终端的联系,成为独立于终端之外的独立进程。
3,忽略SIGHUP信号,重新fork(),使其不是进程组的首进程,防止可以防止在某些情况下进程意外的打开终端而重新与终端发生联系。
4,改变工作目录,清除文件掩码,使守护进程在在哪里启动都可以,消除自身掩码对创建文件的影响。
5,关闭打开文件。因为子进程会继承父进程的打开文件,这样可以防止以后可能的冲突。
6,打开log;
整个的代码框架如下:

#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);
}

阅读(160) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~