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

news2024/11/25 20:39:10

在这里插入图片描述

阅读导航

  • 引言
  • 一、守护进程简介
    • 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/null
    int fd = open(nullfile.c_str(), O_RDWR);  // 打开/dev/null设备文件获取文件描述符fd
    if (fd > 0) {
        dup2(fd, 0);  // 将标准输入重定向到/dev/null
        dup2(fd, 1);  // 将标准输出重定向到/dev/null
        dup2(fd, 2);  // 将标准错误重定向到/dev/null
        close(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://www.coloradmin.cn/o/1554544.html

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

相关文章

FreeRTOS从代码层面进行原理分析(4 移植)

FreeRTOS从代码层面进行原理分析(4 移植) 从前 3 篇博客中我们已经搞清楚了最开始对 FreeRTOS 有疑问的前 2 个问题。 1. FreeRTOS 是如何建立任务的呢&#xff1f; 2. FreeRTOS 是调度和切换任务的呢&#xff1f; 3. FreeRTOS 是如何保证实时性呢&#xff1f; 以下就是前三…

LeetCode:300最长递增子序列 C语言

300. 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子…

大话设计模式之迪米特法则

迪米特法则&#xff0c;也称为最少知识原则&#xff08;Law of Demeter&#xff09;&#xff0c;是面向对象设计中的一个重要原则&#xff0c;其核心思想是降低耦合度、减少对象之间的依赖关系&#xff0c;从而使系统更加灵活、易于维护和扩展。 根据迪米特法则&#xff0c;一…

Multisim14.0破解安装教程

Multisim14.0中文破解版是一款相当优秀的专业化SPICE仿真标准环境&#xff0c;Multisim14.0中文版功能强悍&#xff0c;为用户提供了所见即所得的设计环境、互动式的仿真界面、动态显示元件、具有3D效果的仿真电路、虚拟仪表、分析功能与图形显示窗口等等。Multisim破解版操作简…

Linux-1.常见指令以及权限理解

目录 本节目标 使用 XShell 远程登录 Linux 关于 Linux 桌面 下载安装 XShell 查看 Linux 主机 ip 使用 XShell 登陆主机 XShell 下的复制粘贴 Linux下基本指令 登录Linux服务器 新建多用户 全屏 1.快速认识5~6个命令 2.详细谈论课件的所有指令 01. ls 指令 02…

Linux 环境安装Nginx—源码和Dokcer两种安装方式

一、源代码编译安装Nginx 1.下载最新nginx源码 以nginx-1.25.3.tar.gz为例&#xff1a; 可以使用命令(联网)&#xff1a;curl -O http://nginx.org/download/nginx-1.25.3.tar.gz或在官网下载.tar.gz 2.解压缩 tar -zxvf nginx-1.25.3.tar.gz cd nginx-1.25.3/ 3.安装依赖…

动态菜单设计

查询当前用户下的菜单权限 思路&#xff1a;根据用户id 左关联表 查询出对应的菜单选项 查询SQL select distinct-- 菜单表 去除重复记录sys_menu.id,sys_menu.parentId, sys_menu.name from -- 权限表sys_menu-- 角色与权限表 菜单表id 角色菜单表的菜单id left j…

数据分析之Power BI

POWER QUERY 获取清洗 POWER PIVOT建模分析 如何加载power pivot 文件-选项-加载项-com加载项-转到 POWER VIEW 可视呈现 如何加载power view 文件-选项-自定义功能区-不在功能区中的命令-新建组-power view-添加-确定 POWER MAP可视地图

Redis 6.0.8版本下载

简介&#xff1a;Java领域优质创作者楠木 分享Java项目、简历模板、学习资料、面试题库 想必大家在下载redis之前已经逛了很多教程了&#xff0c;可能不尽如意&#xff0c;找不到自己的想要的版本。既然刷到了我的这条博客&#xff0c;说明你是幸运的&#xff01; Redis6.0.8的…

k8s1.28.8版本配置prometheus监控告警

文章目录 官方架构图组件的具体介绍kube-prometheus包含的组件简介&#xff1a;文件存储路径&#xff1a; 结构分析官网自带的一些规则自己总结流程 1-创建规则磁盘使用率报警规则 详解上面rule流程Alertmanagerg查看 2-报警接收器2.1-邮件报警修改Alertmanager配置查看现有的s…

【深耕 Python】Data Science with Python 数据科学(2)jupyter-lab和numpy数组

关于数据科学环境的建立&#xff0c;可以参考我的博客&#xff1a;【深耕 Python】Data Science with Python 数据科学&#xff08;1&#xff09;环境搭建 Jupyter代码片段1&#xff1a;简单数组的定义和排序 import numpy as np np.array([1, 2, 3]) a np.array([9, 6, 2, …

flume配置文件后不能跟注释!!

先总结&#xff1a;Flume配置文件后面&#xff0c;不能跟注释&#xff0c;可以单起一行写注释 报错代码&#xff1a; [ERROR - org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:158)] Unable to deliver event. Exception follows. org.apache.flume.EventDel…

AI的“换脸“魔术,究竟是弊大于利还是利大于弊?

公众号&#xff1a;【可乐前端】&#xff0c;每天3分钟学习一个优秀的开源项目&#xff0c;分享web面试与实战知识&#xff0c;也有全栈交流学习摸鱼群&#xff0c;期待您的关注! 每天3分钟开源 hi&#xff0c;这里是每天3分钟开源&#xff0c;很高兴又跟大家见面了&#xff0…

Rsyslog 日志集中管理实验

1.使用 进行日志集中管理 C/S 架构&#xff1a;客户端将其日志上传到服务器端&#xff0c;通过对服务器端日志的查询&#xff0c;来实现对其他客户端的日志进行集中管理 2.两台机器&#xff1a; &#xff08;server&#xff09;host-5(192.168.1.2)<------------>(192…

【51单片机入门记录】Onewire单总线协议 温度传感器DS18B20概述

一、温度传感器DS18B20概述 &#xff08;1&#xff09;数字化温度传感器 美国DALLAS半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线”接口的温度传感器。一线总线独特而且经济的特点&#xff0c;使用户可轻松地组建传感器网络&#xff0c;为测量系统的构建…

Redis与数据库的一致性

Redis与数据库的数据一致性 在使用Redis作为应用缓存来提高数据的读性能时&#xff0c;经常会遇到Redis与数据库的数据一致性问题。简单来说&#xff0c;就是同一份数据同时存在于Redis和数据库&#xff0c;如何在数据更新的时候&#xff0c;保证两边数据的一致性。首先&#…

博士科研最好用的科研绘图工具有哪些?

博士科研最好用的科研绘图工具有哪些&#xff1f; 1 chiplot 网址&#xff1a;chiplot ChiPlot是一个功能强大、易于使用的在线图表和数据可视化工具。它提供了多种图表类型和交互性&#xff0c;帮助用户轻松创建精美的图表&#xff0c;并从中获取有价值的信息。 &#xff0…

精准防灾新篇章:GIS与Python机器学习技术在地质灾害风险评价与信息化建库中的前沿应用

结合项目实践案例和科研论文成果进行讲解。入门篇&#xff0c;ArcGIS软件的快速入门与GIS数据源的获取与理解&#xff1b;方法篇&#xff0c;致灾因子提取方法、灾害危险性因子分析指标体系的建立方法和灾害危险性评价模型构建方法&#xff1b;拓展篇&#xff0c;GIS在灾害重建…

C语言刷题(20)

指针笔试题 笔试题1&#xff1a; int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);printf( "%d,%d", *(a 1), *(ptr - 1));return 0; } //程序的结果是什么&#xff1f; *(a 1)等同于a[1]&#xff0c;第一个是2&#xff0c;a的类型是int […

SQL映射文件

一、SQL映射的xml文件 1.1 mapper元素 二、select 三、别名与Java映射 四、resultMap 啊