• Linux-编写简单守护进程


    1、任何一个进程都可以将自己实现成一个守护进程

    2、create_daemon函数要素

    (1)、子进程要等待父进程退出

    (2)、子进程使用setsid创建新的会话期,脱离控制台

    (3)、调用chdir将当前工作目录设置为/

    (4)、umask设置为0以取消任何文件权限屏蔽

    (5)、关闭所有文件描述符

    (6)、将进程0、1、2定位到/dev/null

     1 #include <stdio.h>
     2 #include <unistd.h>
     3 #include <stdlib.h>
     4 #include <sys/types.h>
     5 #include <sys/stat.h>
     6 #include <fcntl.h>
     7 void creat_daemon(void);
     8 int main(void)
     9 {
    10     creat_daemon();
    11     while()
    12     {
    13         printf(" i am running
    ");
    14         sleep();
    15     }
    16     
    17     return 0;
    18 }
    19 
    20 void creat_daemon(void)
    21 {
    22     pid_t pid =0;
    23     
    24     pid = fork();
    25     if(pid < 0)
    26     {
    27         perror("fork");
    28         exit(-1);
    29     }
    30     if(pid > 0)
    31     {
    32         exit(0);    //父进程直接退出
    33     }
    34     //能够执行到到这里的就是子进程了
    35     
    36     //setsid将当前进程设置为一个新的会话期session,
    37     //目的就是让当前进程脱离控制台
    38     pid = setsid();
    39     if(pid < 0)
    40     {
    41         perror("setsid");
    42         exit(-1);
    43     }
    44     //将当前进程工作目录设置为根目录
    45     chdir("/");
    46     //umask设置为0确保将来进程有最大的文件操作权限
    47     umask(0);
    48     //关闭所有文件描述符
    49     //先要获取当前系统中所允许打开的最大文件描述符数目
    50     int cnt = sysconf(_SC_OPEN_MAX);
    51     int i = 0;
    52     for(i = 0; i < cnt; i++)
    53     {
    54         close(i);
    55     }
    56     open("/dev/null", O_RDWR);//打开进程0,将其定位到/dev/null
    57     open("/dev/null", O_RDWR);//打开进程1,将其定位到/dev/null
    58     open("/dev/null", O_RDWR);//打开进程2,将其定位到/dev/null
    59 }
  • 相关阅读:
    01_Linux基础篇
    Docker
    Day02_IP地址详解&进制转换&DOS基本命令与批处理
    Day01_虚拟化架构与系统部署
    重学TCP/IP协议和三次握手四次挥手
    作为一个程序员,CPU的这些硬核知识你必须会!
    通过docker-compose制作dubbo-admin和zookeeper组合服务
    双主master-master复制Err 1677故障分析
    唐宇迪-人工智能学习路线(上篇)
    DNS访问原理只需9个步骤
  • 原文地址:https://www.cnblogs.com/jiangtongxue/p/11264343.html
Copyright © 2020-2023  润新知