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

    守护进程

    Daemon(精灵)进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。

    Linux后台的一些系统服务进程,没有控制终端,不能直接和用户交互。不受用户登录、注销的影响,一直在运行着,他们都是守护进程。如:预读入缓输出机制的实现;ftp服务器;nfs服务器等。

        创建守护进程,最关键的一步是调用setsid函数创建一个新的Session,并成为Session Leader。

    创建守护进程模型

    1. 创建子进程,父进程退出

    所有工作在子进程中进行形式上脱离了控制终端

    1. 在子进程中创建新会话

             setsid()函数

             使子进程完全独立出来,脱离控制

    1. 改变当前目录为根目录

             chdir()函数

             防止占用可卸载的文件系统

             也可以换成其它路径

    1. 重设文件权限掩码

             umask()函数

             防止继承的文件创建屏蔽字拒绝某些权限

             增加守护进程灵活性

    1. 关闭文件描述符

             继承的打开文件不会用到,浪费系统资源,无法卸载

    1. 开始执行守护进程核心工作
    2. 守护进程退出处理程序模型                                                                                                                                                                                                                                                                                                                                                                                                           【mydaemond.c】
      /***
      mydaemond.c
      ***/
      #include<stdio.h>
      #include<stdlib.h>
      #include<unistd.h>
      #include<fcntl.h>
      #include<sys/stat.h>
      
      void daemonize()
      {
          pid_t pid;
          if((pid == fork()) < 0)
          {
              perror("fork");
              exit(1);
          }
          else if(pid == 0)
          {
              exit(0);
          }
          setsid();
          if(chdir("/") < 0)
          {
              perror("chdir");
              exit(1);
          }
          umask(0);
          close(0);
      
          open("/dev/null",O_RDWR);
          dup2(0,1);
          dup2(0,2);
      }    
      
      int main()
       {
          daemonize();
          while(1);
          return 0;
       }
  • 相关阅读:
    Vue.Draggable 文档总结
    JS深度判断两个对象字段相同
    vue防止按钮在短时间内被多次点击的方法
    设计模式学习-单例模式
    设计模式学习---策略模式
    C#7.0中的解构功能---Deconstruct
    讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute
    .NET Core 使用RabbitMQ
    IL指令详细表
    redis 4.0.13 -- 哨兵模式
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11347751.html
Copyright © 2011-2022 走看看