zoukankan      html  css  js  c++  java
  • 守护进程

        守护进程常常在系统引导装入时启动,在系统关闭时终止,没有控制终端,所以是在后台运行的,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
    ";
    15     len =strlen(buf);
    16     pc=fork(); 
    17     if(pc<0)
    18     {
    19         printf("error fork
    ");
    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
    ";
    16     len =strlen(buf);
    17     pc=fork();
    18     if(pc<0)
    19     {
    20         printf("error fork
    ");
    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
    ", "setsid");
    29         exit(1);
    30     }
    31     if((sid=chdir("/"))<0)
    32     {
    33         syslog(LOG_ERR, "%s
    ", "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
  • 相关阅读:
    复习题之后缀表达式
    专项训练之枚举
    专项训练之二分
    深夜毒物
    笑面的学校日常(14)最近一次更新2017 04 06
    了不起的竞赛生(7)(最近一次更新2017 04 06)
    水题日常——动态规划 洛谷
    Bzoj 1926: [Sdoi2010]粟粟的书架(二分答案+乱搞+主席树)
    Cogs 1708. 斐波那契平方和(矩阵乘法)
    Codevs 1482 路线统计(矩阵乘法)
  • 原文地址:https://www.cnblogs.com/lihuidashen/p/3470958.html
Copyright © 2011-2022 走看看