守护进程

简介:     守护进程常常在系统引导装入时启动,在系统关闭时终止,没有控制终端,所以是在后台运行的,linux大部分服务器就是用守护进程实现的,守护进程的编程也不复杂,下面来说一下守护进程的特征、编程规则、出错处理等。

    守护进程常常在系统引导装入时启动,在系统关闭时终止,没有控制终端,所以是在后台运行的,linux大部分服务器就是用守护进程实现的,守护进程的编程也不复杂,下面来说一下守护进程的特征、编程规则、出错处理等。

守护进程的特征:

1.所有守护进程都以超级用户(ID=0)的优先权运行;

2。没有一个守护进程具有控制终端—终端名称设置为问号(?)、终端前台进程组I D设置为-1。缺少控制终端可能是精灵进程调用了s e t s i d的结果。

3.除u p d a t e以外的所有精灵进程都是进程组的首进程,对话期的首进程,而且是这些进程组和对话期中的唯一进程。u p d a t e是它所在进程组和对话期(中的唯一进程,但4是该进程组的首进程(可能也是该对话期的首进程)已经终止。

4.所有这些守护进程的父进程都是i n i t进程。

 

 守护进程的编程规则:

1.创建子进程,父进程推出,先调用fork函数,之后使父进程exit,只对下面做的setsid调用是必要的前提条件;

2.调用setsid函数创建一个新的会话,并担任组长,形式如下:

      setsid()函数格式:

     #include <sys/types.h>

     #include <unist.h>

     Pid_t setsid(void)

    函数成功时返回该进程组ID, 出错时返回-1;

3.改变当前目录为根目录  chdir(“/”);

4.重设文件权限掩码   umask(0);因为由继承得来的方式创建屏蔽字可能会拒绝设置某些许可权;

5.关闭不再需要的文件描述符,调用如下:

for(i=0;i<MAXFILE;I++)

close(i);

下面来举个例子说明一下守护进程的创建,代码如下:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<fcntl.h>
 5 #include<sys/types.h>
 6 #include<unistd.h>
 7 #include<sys/wait.h>
 8          
 9 #define MAXFILE 65535
10 int main()
11 {
12     pid_t pc;
13     int i,fd,len;
14     char *buf="This is a Dameon\n";
15     len =strlen(buf);
16     pc=fork(); 
17     if(pc<0)
18     {
19         printf("error fork\n");
20         exit(1);
21     }
22     else if(pc>0)
23         exit(0);
24     setsid();
25     chdir("/");
26     umask(0);
27     for(i=0;i<MAXFILE;i++)
28         close(i);
29     while(1)
30     {
31         if((fd=open("/tmp/dameon.log",O_CREAT|O_WRONLY|O_APPEND,0600))<0)
32         {
33             perror("open");
34             exit(1);
35         }
36         write(fd, buf, len+1);
37         close(fd);
38         sleep(10);
39     }
40 }
dameon.c

守护进程的出错处理:

  由于守护进程完全脱离了控制终端,因此,不能像其它程序一样通过输出错误到控制台的方式来通知程序员,一般使用syslog服务,将出错信息输入到“/var/log/message”系统日志文件中,Syslog是Linux中的系统日志管理服务,通过守护进程stslog来维护,还是举个例子来说明,代码如下:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<fcntl.h>
 5 #include<sys/types.h>
 6 #include<unistd.h>
 7 #include<sys/wait.h>
 8 #include<syslog.h>
 9          
10 #define MAXFILE 65535
11 int main()
12 {
13     pid_t pc,sid;
14     int i,fd,len;
15     char *buf="This is a Dameon\n";
16     len =strlen(buf);
17     pc=fork();
18     if(pc<0)
19     {
20         printf("error fork\n");
21         exit(1);
22     }
23     else if(pc>0)
24         exit(0);
25     openlog("demo_update",LOG_PID, LOG_DAEMON);
26     if((sid=setsid())<0)
27     {
28         syslog(LOG_ERR, "%s\n", "setsid");
29         exit(1);
30     }
31     if((sid=chdir("/"))<0)
32     {
33         syslog(LOG_ERR, "%s\n", "chdir");
34         exit(1);
35     }
36     umask(0);
37     for(i=0;i<MAXFILE;i++)
38         close(i);
39     while(1)
40     {
41         if((fd=open("/tmp/dameon.log",O_CREAT|O_WRONLY|O_APPEND, 0600))<0)
42         {
43             syslog(LOG_ERR, "open");
44             exit(1);
45         }
46         write(fd, buf, len+1);
47         close(fd);
48         sleep(10);
49     }
50     closelog();
51     exit(0);
52 }
syslog_dema.c
相关文章
|
3月前
守护进程笔记
守护进程笔记
20 0
|
5月前
|
Shell Linux C++
C/C++ 守护进程的创建
C/C++ 守护进程的创建
46 0
|
9月前
|
C++
C++采用Daemon进行后台程序部署
在C++中,如果要让一个程序一直在后台运行并且和终端会话分离,我们可以将其作为守护进程运行,以下是创建C++守护进程的一般步骤。
65 0
|
Shell Linux
【Linux守护进程】二、守护进程详解
【Linux守护进程】二、守护进程详解
161 0
【Linux守护进程】二、守护进程详解
|
Unix Linux
【Linux守护进程】一、进程组与会话
【Linux守护进程】一、进程组与会话
104 0
|
jenkins 持续交付
jenkins通过supervisor配置守护进程
jenkins通过supervisor配置守护进程
183 0
|
Unix Linux iOS开发
守护进程详解
守护进程详解
180 0
|
Unix 应用服务中间件 Shell
Supervisor守护进程
使用Supervisor的背景: #Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。
1155 0
|
Java Python
Supervisor 进程守护工具
说明 公司Linux服务器无法连接外网,只能下载安装包上传到服务器进行离线安装 Python版本: Python-2.7.5 Supervisor版本: supervisor-3.1.3 setuptools版本: setuptools-2.0 meld3版本: meld3-1.0.2 Supervisor简介 Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。

热门文章

最新文章