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

    概念
    Daemon(精灵)进程,是Linux中的后台服务进程,生存期较长的进程,通常独立于控制终
    端并且周期性地执行某种任务或等待处理某些发生的事件。
    模型
    守护进程编程步骤
    1. 创建子进程,父进程退出
    所有工作在子进程中进行
      形式上脱离了控制终端
    2. 在子进程中创建新会话
      setsid()函数
      使子进程完全独立出来,脱离控制
    3. 改变当前目录为根目录
      chdir()函数
      防止占用可卸载的文件系统
      也可以换成其它路径
    4. 重设文件权限掩码
      umask()函数
      防止继承的文件创建屏蔽字拒绝某些权限
      增加守护进程灵活性
    5. 关闭文件描述符
      继承的打开文件不会用到,浪费系统资源,无法卸载
    6. 开始执行守护进程核心工作
    7. 守护进程退出处理
    代码模型
    #include <stdlib.h>
    #include <stdio.h>
    #include <fcntl.h>
    void daemonize(void)
    {
    pid_t pid;
    /*
    * 成为一个新会话的首进程,失去控制终端
    */
    if ((pid = fork()) < 0) {
    perror("fork");
    exit(1);
    } else if (pid != 0) /* parent */
    exit(0);
    setsid();
    /*
    * 改变当前工作目录到/目录下.
    */
    if (chdir("/") < 0) {
    perror("chdir");
    exit(1);
    }
    /* 设置umask为0 */
    umask(0);
    /*
    * 重定向0,1,2文件描述符到 /dev/null,因为已经失去控制终端,再操作0,1,2没有意义.
    */
    close(0);
    open("/dev/null", O_RDWR);
    dup2(0, 1);
    dup2(0, 2);
    }
    int main(void)
    {
    daemonize();
    while(1); /* 在此循环中可以实现守护进程的核心工作 */
    }
    运行这个程序,它变成一个守护进程,不再和当前终端关联。用ps命令看不到,必须运
    行带x参数的ps命令才能看到。另外还可以看到,用户关闭终端窗口或注销也不会影响守护
    进程的运行。

  • 相关阅读:
    leetcode链表--15、reverse-nodes-in-k-group(按照k值进行k个结点的逆序)
    4、消除重复元素--网易2017春招
    24、剑指offer--二叉树中和为某一值的路径
    leetcode链表--14、add-two-numbers(两链表相加 得到新链表)
    3、调整队形--网易2017春招
    2、赶去公司--网易2017春招
    1、双核处理--网易2017春招
    CSS3自定义滚动条样式 -webkit-scrollbar
    git安装使用
    div+css居中
  • 原文地址:https://www.cnblogs.com/phpzhou/p/5820162.html
Copyright © 2011-2022 走看看