阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

剖析Linux的守护神

294次阅读
没有评论

共计 1813 个字符,预计需要花费 5 分钟才能阅读完成。

后台进程与守护进程的区别
    最大的区别有以下几点:

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

剖析 Linux 的守护神

守护进程的特点

守护进程 (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  256
      
      for(i=0; i

       

    6. 改变当前工作目录。进程活动时,其工作目录所在的文件系统不能卸载。因此需要将守护进程的工作目录改变到合适的目录。代码如下:
      chdir("/tmp");
    7. 重设文件创建掩码。进程从创建它的父进程那里继承了文件创建掩码。它可能修改守护进程所创建的文件的存取权限。代码如下:
      umask(0);
    8. 处理 SIGCHLD 信号(子进程退出信号)。如果不等待子进程结束,子进程将成为僵尸进程从而占用系统内核资源。
      /* 将子进程退出信号设为 SIG_IGN,让系统帮助回收进程资源 */
      signal(SIGCHLD, SIG_IGN);

      整体代码如下:

      #define NOFILE      256
      
      void 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()函数的进程成为新的会话的领头进程,并与其父进程的会话组和进程组脱离。由于会话对控制终端的独占性,进程同时与控制终端脱离。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计1813字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19352
评论数
4
阅读量
8053412
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
免费领取huggingface的2核16G云服务器,超简单教程

免费领取huggingface的2核16G云服务器,超简单教程

免费领取 huggingface 的 2 核 16G 云服务器,超简单教程 前言 HuggingFace.co...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统 大家好,我是星哥。公司的项目文档存了一堆 ...
星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的 NAS 中! 大家对「数据安全感」的需求越来越高 ...
终于收到了以女儿为原型打印的3D玩偶了

终于收到了以女儿为原型打印的3D玩偶了

终于收到了以女儿为原型打印的 3D 玩偶了 前些日子参加某网站活动,获得一次实物 3D 打印的机会,于是从众多...
【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件 大家好,我是星哥,很多人都希望能高效地保存微信公众号的文章,用于...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站 - 手机博物馆 -CHAZ 3D Experience 一句话介绍:一个用 3D 方式重温...
如何安装2026年最强个人助理ClawdBot、完整安装教程

如何安装2026年最强个人助理ClawdBot、完整安装教程

如何安装 2026 年最强个人助理 ClawdBot、完整安装教程 一、前言 学不完,根本学不完!近期,一款名...
星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛 NAS-14:解锁公网自由!Lucky 功能工具安装使用保姆级教程 作为 NAS 玩家,咱们最...
浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍 前言 在 AI 自动化快速发展的当下,浏览器早已不再只是...
你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...