【探索Linux】—— 强大的命令行工具 P.31(守护进程)

在这里插入图片描述

阅读导航

  • 引言
  • 一、守护进程简介
    • 1. 概念
    • 2. 特点
  • 二、用C++创建守护进程
    • ⭕代码
    • ✅主要步骤
  • 温馨提示

引言

当谈到计算机系统中运行的特殊进程时,守护进程(daemon)无疑是一个备受关注的话题。作为在后台默默运行并提供各种服务的进程,守护进程在系统运行过程中扮演着不可或缺的角色。与用户交互较少,但却能够持续提供网络服务、日志管理等功能,守护进程的设计目标旨在为整个系统运行提供稳定可靠的支持,而不会打扰用户的正常操作。在本文中,我们将深入探讨守护进程的工作原理、启动机制以及其在计算机系统中的重要性。通过对守护进程的全面了解,我们能够更好地理解其在系统中的作用和意义。

一、守护进程简介

1. 概念

守护进程(daemon)是在计算机系统中在后台运行的一种特殊进程,独立于控制终端并且通常在系统启动时启动。它的主要任务是提供服务、执行特定的任务或者监视其他进程,而不需要用户干预或直接交互。守护进程通常以"d"结尾的名称来命名,比如httpd、sshd等。

守护进程通常处于睡眠状态,等待某些条件发生时被唤醒,并在完成任务后重新进入睡眠状态。它们往往在系统启动时由初始化脚本启动,并在系统关闭时被关闭。

2. 特点

  1. 在后台运行:守护进程在后台默默地执行任务,不会占用用户的控制终端。
  2. 独立于用户:守护进程通常不与任何用户直接交互,而是为系统或其他应用程序提供服务。
  3. 提供特定功能或服务:守护进程通常被设计用来执行特定的任务或者提供特定的服务,比如网络服务、日志管理等。
  4. 稳定可靠:守护进程需要保持稳定可靠地运行,确保系统的正常运行并提供持续的服务。
  5. 无需用户干预:守护进程通常不需要用户干预,能够自主地执行其任务。

二、用C++创建守护进程

⭕代码

#pragma once#include <iostream>
#include <cstdlib>
#include <unistd.h>
#include <signal.h>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>const std::string nullfile = "/dev/null";// 将当前进程变成守护进程
void Daemon(const std::string& cwd = "") {// 1. 忽略其他异常信号signal(SIGCLD, SIG_IGN);   // 忽略子进程状态改变的信号signal(SIGPIPE, SIG_IGN);  // 忽略管道破裂的信号signal(SIGSTOP, SIG_IGN);  // 忽略停止信号// 2. 将自己变成独立的会话if (fork() > 0)exit(0);  // 父进程退出setsid();  // 创建新的会话,子进程成为会话领导者// 3. 更改当前调用进程的工作目录if (!cwd.empty())chdir(cwd.c_str());  // 切换当前工作目录到指定目录// 4. 标准输入,标准输出,标准错误重定向至/dev/nullint fd = open(nullfile.c_str(), O_RDWR);  // 打开/dev/null设备文件获取文件描述符fdif (fd > 0) {dup2(fd, 0);  // 将标准输入重定向到/dev/nulldup2(fd, 1);  // 将标准输出重定向到/dev/nulldup2(fd, 2);  // 将标准错误重定向到/dev/nullclose(fd);    // 关闭文件描述符fd}
}

✅主要步骤

  1. 忽略异常信号

    • 使用 signal(SIGCLD, SIG_IGN) 忽略子进程状态改变的信号,这样父进程不会再关心子进程的退出状态。
    • 使用 signal(SIGPIPE, SIG_IGN) 忽略管道破裂的信号,防止进程在向一个已经关闭的写端口写入数据时终止。
    • 使用 signal(SIGSTOP, SIG_IGN) 忽略停止信号,防止进程被停止执行。
  2. 创建新的会话

    • 通过 fork() 创建一个子进程,如果成功则父进程退出。
    • 使用 setsid() 将子进程设置为新的会话领导者。这样做的目的是让子进程摆脱原有的终端和会话关联,从而避免受到终端的影响。
  3. 切换工作目录

    • 如果传入了 cwd 参数,即要切换到的工作目录,使用 chdir() 切换当前进程的工作目录到指定的目录。
  4. 重定向输入输出

    • 打开 /dev/null 设备文件,获取其文件描述符 fd
    • 使用 dup2(fd, 0) 将标准输入重定向到 /dev/null,将文件描述符 fd 复制给标准输入文件描述符 0
    • 使用 dup2(fd, 1) 将标准输出重定向到 /dev/null,将文件描述符 fd 复制给标准输出文件描述符 1
    • 使用 dup2(fd, 2) 将标准错误重定向到 /dev/null,将文件描述符 fd 复制给标准错误文件描述符 2
    • 关闭文件描述符 fd

这样,经过以上步骤,当前进程就变成了一个守护进程守护进程独立于终端,不受用户交互的影响,并且将输入输出重定向到 /dev/null,避免产生输出。它可以在后台长时间运行,常用于需要持续提供服务或执行特定任务的场景

温馨提示

感谢您对博主文章的关注与支持!如果您喜欢这篇文章,可以点赞、评论和分享给您的同学,这将对我提供巨大的鼓励和支持。另外,我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于Linux以及C++编程技术问题的深入解析、应用案例和趣味玩法等。如果感兴趣的话可以关注博主的更新,不要错过任何精彩内容!

再次感谢您的支持和关注。我们期待与您建立更紧密的互动,共同探索Linux、C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Linux(4)常见操作整理-静态路由-双网卡-文件上传下载-运维思路-性能监测方法-jar包查找

五、常见操作 1、静态路由配置 【描述】&#xff1a;当前ifconfig eno16777728 对应ip&#xff1a;172.41.0.120 【解决】&#xff1a; &#xff08;1&#xff09; [rootlocalhost ~]# cd /etc/sysconfig/network-scripts/ &#xff08;2&#xff09; 添加文件&#xff1a…

LeetCode_1.两数之和

一、题目描述 二、方法 1.方法1&#xff08;暴力枚举法&#xff09; 利用两个for循环&#xff0c;对数组进行逐一的遍历&#xff0c;直到找到两个数的和为目标值时返回这两个数的下标。以下为c实现的完整代码。 # include<iostream> using namespace std; #include<…

C语言例4-35:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡、问鸡翁、鸡母和鸡雏各几何?

方法一&#xff1a; 代码如下&#xff1a; //鸡翁一&#xff0c;值钱五&#xff1b;鸡母一&#xff0c;值钱三&#xff1b;鸡雏三&#xff0c;值钱一。百钱买百鸡、问鸡翁、鸡母和鸡雏各几何&#xff1f; //方法一&#xff1a; #include<stdio.h> int main(void) {int x…

智慧城市一屏统览,数字孪生综合治理

现代城市作为一个复杂系统&#xff0c;牵一发而动全身&#xff0c;城市化进程中产生新的矛盾和社会问题都会影响整个城市系统的正常运转。智慧城市是应对这些问题的策略之一。城市工作要树立系统思维&#xff0c;从构成城市诸多要素、结构、功能等方面入手&#xff0c;系统推进…

Paper Digest|基于在线聚类的自监督自蒸馏序列推荐模型

论文标题&#xff1a; Leave No One Behind: Online Self-Supervised Self-Distillation for Sequential Recommendation 作者姓名&#xff1a; 韦绍玮、吴郑伟、李欣、吴沁桐、张志强、周俊、顾立宏、顾进杰 组织单位&#xff1a; 蚂蚁集团 录用会议&#xff1a; WWW 2024 …

CSS之动画

一&#xff0c;动画的制作 实现盒子绕圈走 二&#xff0c; 动画的常用属性 三&#xff0c;动画简写属性 前面两个属性一定要写&#xff0c;第三个linear是指匀速的意思&#xff08;默认是ease&#xff09;

【Java多线程】4——特定场景解决办法

4 特定场景解决方法 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记仓库&#x1f449;https://github.com/A-BigTree/tree-learning-notes 个人主页&#x1f449;https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个st…

C语言结合体和枚举的魅力展现

前言 ✨✨欢迎&#x1f44d;&#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页&#xff1a;秋邱’博客 所属栏目&#xff1a;人工智能 &#xff08;感谢您的光临&#xff0c;您的光临蓬荜生辉&#xff09; 引言: 前面我们已经讲了结构体的声明&#xff0c;自引用&#xff0c;内存…

排序C++

题目 法1 sort升序排序&#xff0c;再逆序输出 #include<iostream> #include<algorithm> using namespace std;const int N 5e53;//注意const&#xff0c;全局 int a[N]; int main() {//错误int N5e53;//错误const int a[N];int n;cin >> n;for (int i 1;…

【数据结构】新篇章 -- 顺序表

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;python从入门到精通&#xff0c;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文…

【数据结构】顺序表习题之移除元素和合并两个有效数组

&#x1f451;个人主页&#xff1a;啊Q闻 &#x1f387;收录专栏&#xff1a;《数据结构》 &#x1f389;道阻且长&#xff0c;行则将至 前言 嗨呀&#xff0c;今天的博客是关于顺序表的两道题目&#xff0c;是力扣的移除元素和合并有序数组的题目。 一.移除…

EXCEL通过VBA字典快速分类求和

EXCEL通过VBA字典快速分类求和 汇总截图 Option ExplicitOption Explicit Sub answer3() Dim wb As Workbook Dim sht As Worksheet Set wb ThisWorkbook Set sht wb.Worksheets(2) Dim ss1 As Integer Dim ss2 As Integer Dim i As Integer Dim j As Integer j 1Dim aa()…

人工智能:数字化转型中的关键角色

人工智能&#xff1a;数字化转型中的关键角色 数字化转型是十多年来商业变革的核心&#xff0c;它本身也在人工智能的崛起中发生转变。人工智能有望极大地改变数字化转型&#xff0c;从企业设定的目标到从业者用来推进计划的工具。本文将深入探讨人工智能在数字化转型中的扮演的…

Transformers —— 以通俗易懂的方式解释-Part 1

公众号:Halo咯咯,欢迎关注~ 本系列主要介绍了为ChatGPT以及许多其他大型语言模型(LLM)提供支持的Transformer神经网络。我们将从基础的Transformer概念开始介绍,尽量避免使用数学和技术细节,使得更多人能够理解这一强大的技术。 Transformers —— 以通俗易懂的方式解释…

pip永久修改镜像地址

修改命令&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/ 效果&#xff1a; 会在C:\Users\PC(用户名)\AppData\Roaming\pip目录下新增或修改文件pip.ini 文件内容&#xff1a; [global] index-url https://pypi.tuna.tsinghua.e…

关于web_server项目的学习记录(自用)

主要参考资料&#xff1a; 我在地铁吃闸机 基础处理框架&#xff1a;Multi-reactor muduo库有三个核心组件实现持续监听reactor的fd&#xff1a;channel;epoll/poller/eventloop类 channel 事件监听器epoll_ctl监听到了fd发生了什么事件,channel类会封装每个fd和fd感兴趣的事…

9、鸿蒙学习-开发及引用静态共享包(API 9)

HAR&#xff08;Harmony Archive&#xff09;是静态共享包&#xff0c;可以包含代码、C库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP&#xff0c;不能独立安装运行在设备上&#xff0c;只能作为应用模块的依赖项被引用。…

ethers.js:sign(签名)

Signers 在ethers中Signer是以太坊账户的抽象&#xff0c;可以用来签名消息和交易&#xff0c;如将签名的交易发送到以太坊网络以执行状态更改的操作。 npm install ethers5.4.0// 引入 import { ethers } from ethers签名 this.provider new ethers.providers.Web3Provider(…

36.not comply with the UI component syntax不允许在UI描述里直接使用

不允许在UI描述里直接使用&#xff0c;但可以在方法或者函数里使用 not comply with the UI component syntax. <etsLint> 这里ok:

搜索与图论——Floyd算法求最短路

floyd算法用来求多源汇最短路 用邻接矩阵来存所有的边 时间复杂度O(n^3) #include<iostream> #include<cstring> #include<algorithm>using namespace std;const int N 20010,INF 1e9;int n,m,k; int g[N][N];void floyd(){for(int k 1;k < n;k ){f…