Linux守护进程揭秘-无声无息运行在后台


在Linux系统中,有一些特殊的进程悄无声息地运行在后台,如同坚实的基石支撑着整个系统的运转。它们就是众所周知的守护进程(Daemon)。本文将为你揭开守护进程的神秘面纱,探讨它们的本质特征、创建过程,以及如何重定向它们的输入输出。通过C++代码示例,你将领略到守护进程背后的编程哲学。


一、守护进程简介


守护进程顾名思义,就是在系统后台默默守护的进程。它们通常在系统启动时创建,并一直运行至系统关闭,生命周期非常长。常见的守护进程包括cron调度器、SSH服务器(sshd)、Redis数据库、Nginx Web服务器等。

守护进程有两个主要特点:

  1. 在后台运行,没有控制终端。因此内核永远不会为它们生成任何与终端相关的信号,如SIGINT(中断)、SIGTSTP(停止)等。
  2. 不受父进程影响。当创建守护进程时,会让出与父进程的关联,成为一个独立的进程组。

根据这一特性,某些守护程序会将SIGINT和SIGHUP信号视为一种通知机制。

如果守护程序接收到这两个信号,这通常意味着信号是由用户或服务本身触发的。


例如,在nginx中,当我们执行nginx -s reload命令以热更新配置文件时,实际上是向nginx的主进程发送了一个SIGHUP信号。

此外,在Linux系统中,也有一些特定的守护进程以线程的方式运行,例如pdflush,它会定期将缓冲区中的数据刷新到磁盘。


守护进程本质上是一个孤儿进程,其父进程在执行fork()之后会立即终止。因此,守护进程最终会被init进程所收养。同时,孤儿进程本身并没有害处。


二、创建守护进程的过程


在Linux系统中,创建一个守护进程通常遵循一个固定的模板,其过程相对标准化,很难省略其中的任何步骤。


创建守护进程的步骤基本如下:

  1. 分身:父进程fork出子进程,然后父进程退出。

    • 执行一个fork(),创建出子进程之后父进程退出,子进程继续执行,如果守护进程是从shell 中创建的,那么守护进程应该让出终端控制,不能占用。
    • 子进程一定不会作为一个进程组的首进程,才有可能释放与当前终端的所有关联。
  2. 开启新会话:子进程调用setsid()脱离所有终端,创建新会话。

    • 一般情况下,终端下直接运行的进程当终端被关闭时,运行的进程也会退出执行
    • 调用成功后终端是否被关闭将不会影响到子进程的运行。
  3. 更改工作目录:防止意外占用目录。

  4. 重置umask:确保有创建文件/目录的权限。

  5. 关闭已打开文件描述符:包括标准输入/输出/错误,防止影响后续程序运行。

    • 因为标准输入、标准输出以及标准错误和终端相关,而我们的守护进程和任何终端都不产生联系,留着这
3 个文件描述符完全没有必要。
    • 但是我们又不能直接关闭掉这
3 个文件描述符,万一程序在某个地方执行了 printf(),那么就会出现错误。
  6. 重定向标准输入/输出/错误:为日志等做准备。

  7. 处理信号:决定如何响应常见信号。


下面是一段简单的代码,演示了创建守护进程的基本流程:

#include <iostream>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>void daemonize() {// 分身,父进程退出pid_t pid = fork();if (pid < 0) exit(EXIT_FAILURE);if (pid > 0) exit(EXIT_SUCCESS);// 子进程继续,开启新会话if (setsid() < 0) exit(EXIT_FAILURE);// 更改工作目录chdir("/");// 重置umaskumask(0);// 关闭已打开文件描述符for (int i = sysconf(_SC_OPEN_MAX); i >= 0; i--) {close(i);}// 重定向标准输入/输出/错误open("/dev/null", O_RDWR);dup(0);dup(0);
}int main() {daemonize();// 守护进程主循环while (1) {sleep(1);std::cout << "Daemon running..." << std::endl;}return 0;
}

三、输入输出重定向


在这里插入图片描述


你可能已经注意到,上面的代码中我们重定向了守护进程的标准输入/输出/错误流。这是因为终端关闭时,如果进程还持有这些文件描述符,就会收到SIGHUP信号而退出。而我们的守护进程并不希望如此。


重定向的方式是先打开/dev/null(空设备文件),然后使用dup2()系统调用,将标准输入/输出/错误流的文件描述符指向这个空文件。之后守护进程所有的输入输出都将被丢弃,不会影响到正常运行。


在程序内,如果我们想要将
STDIN_FILENO、STDOUT_FILENO 以及
STDERR_FILENO 这
3 个描述符重定向到
/dev/ null 的话,就需要借助
dup2() 这一系统调用 。


int fd = open("/dev/null", O_RDWR);
dup2(fd, STDIN_FILENO);  
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);

如果我们把文件描述符看作是指针的话,那么
dup2(A,
B) 的作用就是把
A
指向的东西给到
B,让
B的指向和
A
的指向相同。


四、守护万象更新潮流


守护进程作为Linux系统不可或缺的一员,扮演着重要的角色。从上世纪90年代开始,守护进程编程的理念就根深蒂固,影响着整个Linux生态的发展。然而,近年来随着容器和微服务的兴起,传统的守护进程模式也面临着一些挑战和质疑。守护进程的未来将如何演进?它们是否会被新技术所取代?这些都将是值得我们继续关注和探讨的话题。而无论形式如何变迁,稳定、高效、隐身于后台的设计思想,必将patrimony代代相传。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/849626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国产主流软硬件厂商生态分析

国产领域主流厂商汇总 信创&#xff0c;即信息技术应用创新&#xff0c;由“信息技术应用创新工作委员会”于2016年3月4日发起&#xff0c;是专注于软硬件关键技术研发、应用与服务的非营利性组织。作为科技自强的关键力量&#xff0c;信创在我国信息化建设中占据核心地位&…

外部mysql导入

利用这个命令&#xff1a; mysql -u username -p database_name < file.sql 然后就这样。成功导入。

定个小目标之每天刷LeetCode热题(12)

这是一道简单题&#xff0c;使用位运算中的异或运算即可&#xff0c;异或运算有以下性质&#xff1a; 1、任何数异或 0 结果仍然是原来的数&#xff0c;即 a⊕0a 2、任何数和其自身做异或运算&#xff0c;结果是 0 所以我们只需要让数组里的所有元素进行异或运算得到的结果就…

探索风电机组:关键软件工具全解析

探索风电机组&#xff1a;关键软件工具全解析 随着可再生能源市场的迅猛发展&#xff0c;风电作为一种重要的可再生能源&#xff0c;其相关技术和工具也越来越受到重视。风电机组的设计、仿真、优化及运维等方面&#xff0c;都需要依靠一系列专业软件工具来实现。这些软件涵盖…

Netty中的ByteBuf使用介绍

ByteBuf有三类&#xff1a; 堆缓存区&#xff1a;JVM堆内存分配直接缓冲区&#xff1a;有计算机内存分配&#xff0c;JVM只是保留分配内存的地址信息&#xff0c;相对于堆内存方式较为昂贵&#xff1b;复合缓冲区&#xff1a;复合缓冲区CompositeByteBuf&#xff0c;它为多个B…

VS2019创建c++动态链接库dll与调用方法

VS2019创建c动态链接库dll与调用方法 1.点击文件-》新建-》项目&#xff0c;输入dll,选择具有导出项的(DLL)动态链接库 2.输入一个文件名&#xff1a;dll2 头文件.h 3.添加加减法函数&#xff1a; // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的…

题解web

1.[LitCTF 2023]Follow me and hack me 1&#xff09;进入题目环境&#xff0c;提示get传参&#xff0c;post传参 2&#xff09;看看源码&#xff0c;也没啥 3&#xff09;直接用hackbar&#xff0c;传入对应参数即可得到FLAG 3&#xff09;但是扫描出来它后端还有东西&#x…

Vue 学习笔记 总结

Vue.js 教程 | 菜鸟教程 (runoob.com) 放一下课上的内容 Vue练习 1、练习要求和实验2的用户注册一样&#xff0c;当用户输入后&#xff0c;能在下方显示用户输入的各项内容&#xff08;不需要实现【重置】按钮&#xff09; 2、实验报告中的实验小结部分来谈谈用JS、jQuery和…

618数码产品有什么推荐?四大2024“宝藏”数码产品推荐!

随着618购物节的热情逐渐升温&#xff0c;你是否在繁多且诱人的商品海洋中迷失方向&#xff0c;难以找到那最心仪的宝贝&#xff1f;团团在此特别为你精心挑选了一系列经过亲身体验的优质好物。这些推荐不仅时尚前沿&#xff0c;更贴合你的日常生活需求&#xff0c;确保实用与品…

霸气的短视频:成都科成博通文化传媒公司

霸气的短视频&#xff1a;瞬间的力量与魅力 在数字化浪潮中&#xff0c;短视频以其独特的魅力迅速崛起&#xff0c;成为社交媒体的新宠。而在众多短视频中&#xff0c;那些充满霸气、让人热血沸腾的作品&#xff0c;总能引起广泛的关注和讨论。成都科成博通文化传媒公司将从内…

CSS基础知识汇总

目录 CSS 基础知识1. CSS 的基本结构2. 选择器3. 常用 CSS 属性4. CSS 单位5. CSS 盒模型 总结 学习 CSS&#xff08;Cascading Style Sheets&#xff09;是前端开发的重要部分&#xff0c;它用于控制网页的样式和布局。以下是学习 CSS 过程中需要掌握的基本概念、符号和对应的…

Vue08-数据代理

一、Object.defineProperty() Object.defineProperty() 是 JavaScript 中的一个方法&#xff0c;用于直接在一个对象上定义一个新属性&#xff0c;或者修改一个对象的现有属性&#xff0c;并返回这个对象。 这个方法允许你精确地控制一个对象的属性&#xff0c;包括它的值、是…

数据库存储过程和锁机制

存储过程 存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的&#xff0c;存储过程思想上很简单,就是数据库SQL语言层面的代码封装与有重用 …

Flutter开发效率提升1000%,Flutter Quick教程之对Widget进行删除,剪切,粘贴

一&#xff0c;删除操作 1&#xff0c;首先我们选中要删除的Widget。 2&#xff0c;在左边的侧边栏&#xff0c;点击删除按钮&#xff0c;即可完成对组件的删除操作。 二&#xff0c;剪切。剪切是相同的道理&#xff0c;都是先选中&#xff0c;再点击对应的按钮。 1&#xff…

javaWeb4 Maven

Maven-管理和构建java项目的工具 基于POM的概念 1.依赖管理&#xff1a;管理项目依赖的jar包 &#xff0c;避免版本冲突 2.统一项目结构&#xff1a;比如统一eclipse IDEA等开发工具 3.项目构建&#xff1a;标准跨平台的自动化项目构建方式。有标准构建流程&#xff0c;能快速…

java 原生http服务器 测试JS前端ajax访问实现跨域传post数据

后端 java eclipse 字节流转字符 package Httpv3;import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer;import java.io.IOException; import java.i…

【全开源】JAVA打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车源码

&#xff1a;构建便捷出行新体验 一、引言&#xff1a;探索打车系统小程序源码的重要性 在数字化快速发展的今天&#xff0c;打车系统小程序已成为我们日常生活中不可或缺的一部分。它以其便捷、高效的特点&#xff0c;极大地改变了我们的出行方式。而背后的关键&#xff0c;…

KOL+UGC:解锁品牌内容营销新策略,增强用户参与与互动

在当今数字化时代&#xff0c;品牌与受众之间的互动性和参与感变得至关重要。其中&#xff0c;KOL和UGC&#xff08;用户生成内容&#xff09;的结合&#xff0c;为品牌创造了一种全新的内容创作模式。这种模式不仅增强了内容的吸引力&#xff0c;还极大地提升了品牌与受众之间…

win键盘键位映射:欧版键盘->国内布局|是否应该买国外版笔记本?

最近买了个欧版笔记本电脑&#xff0c;键盘是欧版键盘&#xff1a; 键盘上的按钮实体和国内不完全一样键盘按钮上印的字母符号和国内不完全一样 具体差异 如图&#xff1a; shift处欧版是两个按键。可通过键盘键位映射解决。回车Enter、| 、布局不同。非常别扭&#xff0c;…

跨境反向海淘系统:业务流程解析与未来发展展望

随着全球化的深入发展和互联网技术的飞速进步&#xff0c;跨境购物已经成为越来越多消费者日常生活中的一部分。在这个过程中&#xff0c;反向海淘系统以其独特的优势&#xff0c;逐渐崭露头角&#xff0c;成为跨境电商领域的新星。作为一名在跨境反向海淘系统业务中耕耘了10年…