2019独角兽企业重金招聘Python工程师标准>>>

后台进程与守护进程的区别

  • 最大的区别有以下几点:
  • (a)守护进程已经完全脱离终端控制台了,而后台程序并未完全脱离终端(在终端未关闭前还是会往终端输出结果);
  • (b)守护进程在关闭终端控制台时不会受影响,而后台程序会随用户退出而停止,需要在以nohup command & 格式运行才能避免影响;
  • (c)守护进程的会话组和当前目录,文件描述符都是独立的。后台运行只是终端进行了一次fork,让程序在后台执行,这些都没改变;

守护进程的特点

守护进程(Daemon)是在后台运行的一种特殊进程,它脱离于终端,从而这可避免进程被任何终端所产生的信号打断,它在执行进程中的产生信息也不在任何终端上显示。守护进程周期性地执行某种任务或等待处理某些发生的事件,Linux的大多数服务器就是用守护进程实现的。

守护进程编程要点

  1. 屏蔽一些有关控制终端操作的信号,是为了防止在守护进程没有正常启动起来前,控制终端受到干扰退出或挂起。代码如下:

    /* 处理可能的终端信号 */
    signal(SIGTTOU, SIG_IGN);
    signal(SIGTTIN, SIG_IGN);
    signal(SIGTSTP, SIG_IGN);
    signal(SIGHUP , SIG_IGN);
  2. 在后台运行。
    /* 是父进程,结束父进程,子进程继续 */
    if(fork())exit(0);
  3. 脱离控制终端和进程组:
    • (1)一个进程属于一个进程组,进程组号(PGID)就是进程组长的进程号(PID)
    • (2)同进程组中的进程共享一个控制终端,这个控制终端默认是创建进程的终端
    • (3)一个进程关联的控制终端和进程组通常是从父进程继承下来的,因此,这个子进程仍然受到父亲进程终端的影响,因为终端产生的信号会发送给前台进程组的所有进程。

    基于以上原因,需要让为个子进程彻底摆脱该终端的影响,需要调用setsid()使子进程成为新的会话组长,代码如下:

    setsid();

    setsid()调用成功后,调用此函数的进程成为新的会话组长和新的进程组长,并与原来的进程组脱离关系。由于会话过程对控制终端的独占性,进程同时与控制终端脱离。

  4. 禁止进程重新打开控制终端,采用的办法是再次创建一个子进程,并让父亲进程退出,该子进程不再是会话组长,从而达到目的。代码如下:
    /* 结束第一子进程,第二子进程继续 */
    if(fork())exit(0);
  5. 关闭打开的文件描述符。因为进程从创建它的父进程那里继承了打开的文件描述符,一般情况下不再需要。如不关闭,将会浪费系统资源。代码如下:
    #define NOFILE  256for(i=0; i
  6. 改变当前工作目录。进程活动时,其工作目录所在的文件系统不能卸载。因此需要将守护进程的工作目录改变到合适的目录。代码如下:
    chdir("/tmp");
  7. 重设文件创建掩码。进程从创建它的父进程那里继承了文件创建掩码。它可能修改守护进程所创建的文件的存取权限。代码如下:
    umask(0);
  8. 处理SIGCHLD信号(子进程退出信号)。如果不等待子进程结束,子进程将成为僵尸进程从而占用系统内核资源。
    /* 将子进程退出信号设为SIG_IGN,让系统帮助回收进程资源 */
    signal(SIGCHLD, SIG_IGN);

    整体代码如下:

    #define NOFILE      256void DaemonMode()
    {int num = 0;int fd0, fd1, fd2;/* 屏蔽可能的信号 */signal(SIGTTOU, SIG_IGN);signal(SIGTTIN, SIG_IGN);signal(SIGTSTP, SIG_IGN);signal(SIGHUP , SIG_IGN);if(fork())exit(0);setsid();if(fork())exit(0);chdir("/tmp/httpd");umask(0);for(; num

补充 setsid() 函数功能:

如果调用进程已经是一个进程组的组长,则此函数返回错误。为了杜绝这种情况,通常先调用fork()创建子进程,然后使其父进程终止,而子进程继续,在子进程中调用此函数。

如果调用此函数的进程不是一个进程组组长,则此函数会创建一个新会话,调用setsid()函数的进程成为新的会话的领头进程,并与其父进程的会话组和进程组脱离。由于会话对控制终端的独占性,进程同时与控制终端脱离。

原文来自:https://www.linuxprobe.com/analysis-linux-patron.html

转载于:https://my.oschina.net/ssdlinux/blog/1621868

剖析Linux的守护神相关推荐

  1. 剖析 Linux hypervisor

    KVM 和 Lguest 简介 Linux® 的最重要创新之一就是转变为hypervisor(或运行其他操作系统的操作系统).现在涌现许多使用 Linux 作为内核的 hypervisor 解决方案. ...

  2. 剖析Linux系统启动过程

    http://www.5dmail.net/html/2004-11-29/20041129102711.htm 内容提要 本文以RedHat9.0和i386平台为例,剖析了从用户打开电源直到屏幕出现 ...

  3. 深入剖析 linux GCC 4.4 的 STL string

    转自: 深入剖析 linux GCC 4.4 的 STL string 本文通过研究STL源码来剖析C++中标准模板块库std::string运行机理,重点研究了其中的引用计数和Copy-On-Wri ...

  4. 深度剖析 Linux 的 3 种“拷贝”命令

    作者 | 奇伢       责编 | 欧阳姝黎 概述 Linux 下有 3 种"拷贝",分别是 ln,cp,mv,这 3 个命令貌似都能 copy 出一个新的文件出来. 细心的小伙 ...

  5. linux 内核 课程,Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频教 ......

    课程名称 Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频 课程目录 (1)\1, 计算机是如何工作的?:目录中文件数:0个 (2)\2, 操作系统 ...

  6. 深度剖析Linux内核地址映射机制

    深度剖析Linux内核地址映射机制 1.虚拟空间数据结构   2.进程虚拟空间  3.内存映射 视频讲解如下,点击观看: Linux内核开发系列第7讲--深度剖析Linux内核地址映射机制 C/C++ ...

  7. 剖析Linux进程forkvforkclone原理机制丨进程管理指令及监控工具

    剖析Linux进程fork&vfork&clone原理机制丨进程管理指令及监控工具 视频讲解如下,点击观看: 剖析Linux进程fork&vfork&clone原理机制 ...

  8. 深度剖析 Linux cp 命令的秘密

    目录 问题引入: 文件系统 写流程: Inode和block是如何管理的? 一个文件真实的模样 思考问题:一个 inode 结构能够表示多大的文件? 思考问题:怎么才能让你既能表示更大的文件,又能不浪 ...

  9. linux 同步方法剖析,Linux 同步方法剖析

    级别: 中级 M. Tim Jones (), 顾问工程师, Emulex 2007 年 11 月 19 日在 学习 Linux® 的过程中,您也许接触过并发(concurrency).临界段(cri ...

  10. 剖析Linux系统启动过程(二)

    各位是否曾经对电脑整个开机的流程感到好奇呢 ? 这一次 , 我们所要讨论的主题 , 就是 Linux 从开机的一瞬间到 login 为止 , 到底发生了什么事情 ? 想必各位都知道 , 在刚开机时 , ...

最新文章

  1. MaxCompute助力OSS支持EB级计算力
  2. oracle上浮下浮分析函数_Oracle SQL高级编程——分析函数(窗口函数)全面讲解...
  3. 京瓷2010复印a4内容不全_京瓷2010复印机,纸卡定影的故障
  4. SpringBoot+Swagger2.7.0实现汉化(2.8.0不行)
  5. 关于 Unloading class sun.reflect.GeneratedSerial...
  6. 时间序列研(part3)--单积性
  7. Python实现邮件发送
  8. 网络通讯技术在嵌入式系统中的应用
  9. 网络架构设计:CNN based和Transformer based
  10. 布局篇(2)—If you love css …
  11. matlab中erf什么,matlab中的误差函数erf是什么意思?
  12. 几款常用UML建模工具介绍
  13. baidumap vue 判断范围_vue-baidu-map 行政区域划分
  14. 显示风场的某一局部区域,实现多分辨率
  15. 0606关于mysql优化原理
  16. 教你购物只花一半钱,先领优惠券再购物,原来你一直都买贵了?
  17. 【flask】适合生产环境的高并发部署方案(gunicorn + gevent + supervisor)
  18. 云原生(CloudNative)将成为应用云化开发的主流方式
  19. PPT进行简单宣传册(三折页)制作、展板设计与背景装饰添加---幻灯片大小调整、背景格式设置
  20. 前端笔试—编译和体系结构

热门文章

  1. UniApp使用navigateTo无法跳转到tabBar中的页面
  2. LCD液晶显示屏颜色显示波长研究与总结?
  3. 图书馆管理系统 Java
  4. 大数据入门最全组件思维导图
  5. 联想服务器网卡显示不全,ThinkSystem系列服务器板载1Gb网口及LOM网卡接入100Mb交换机显示无连接...
  6. 深度指纹识别:通过深度学习破坏网站指纹防御
  7. Unity学习之生命周期函数
  8. 数据中心与云计算关系
  9. Linux软件漏洞修复指南
  10. 17产品经理需要具备的领导能力