【探索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/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++、算法和编程的奥秘。祝您生活愉快,排便顺畅!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【机器人】UIUC、北大、亚马逊提出基于动作的场景图,让机器人理解和操控未知环境

论文的主要内容是通过机器人操作的交互式探索&#xff0c;构建一个基于动作的场景图&#xff08;Action-Conditioned Scene Graph&#xff0c;简称ACSG&#xff09;来帮助机器人更好地理解和操作未知环境。 全文核心&#xff1a;在未知环境中如何让机器人自主探索并完成复杂任务…

乐维更改IP地址

1.1 系统IP调整 vim /etc/sysconfig/network-scripts/ifcfg-ens1921.2 Web相关服务IP变更 1.2.1 编辑/itops/nginx/html/lwjkapp/.env文件,更改ZABBIXSERVER、ZABBIXRPCURL、DB_HOST中的IP 1.2.2 进入/itops/nginx/html/lwjk_app/目录下,执行php bin/manager process-conso…

记录C++中,vector的迭代器在push_back以后扩容导致迭代器失效的问题

前言 vector是我们用到最多的数据结构&#xff0c;其底层数据结构是单端动态数组&#xff0c;由于数组的特点&#xff0c;vector也具有以下特性&#xff1a; ①O(1)时间的快速访问&#xff1b; ②顺序存储&#xff0c;所以插入到非尾结点位置所需时间复杂度为O(n)&#xff0c;删…

JDK21|史诗级的更新,虚拟线程

作者:鱼仔 博客首页: https://codeease.top 公众号:Java鱼仔 前言 要想看官方对于JDK21的更新说明&#xff0c;可以直接跳转到下面这个官方网站中 官网地址为&#xff1a;https://openjdk.org/projects/jdk/21/ JDK21是最新的LTS版本&#xff0c;里面添加了不少新的特性&…

中小型集群部署,Docker Swarm(集群)使用及部署应用介绍

1、Docker Swarm简介 说到集群&#xff0c;第一个想到的就是k8s&#xff0c;但docker官方也提供了集群和编排解决方案&#xff0c;它允许你将多个 Docker 主机连接在一起&#xff0c;形成一个“群集”&#xff08;Swarm&#xff09;&#xff0c;并可以在这个 Swarm 上运行和管…

【Web APIs】DOM节点

目录 1.节点操作 1.1DOM节点 1.2查找节点 1.2.1父节点查找 1.2.2子节点查找 1.2.3兄弟节点查找 1.3增加节点 1.4克隆节点 1.5删除节点 2.时间对象 2.1实例化 2.2时间对象方法 2.3时间戳 3.重绘和回流 1.节点操作 1.1DOM节点 DOM节点&#xff1a;DOM树中的每一个…

BaseDao封装增删改查

文章目录 什么是BaseDao操作代码增删改查询单个数据查询多个数据 总结 什么是BaseDao BaseDao是&#xff1a; 数据库里负责增加&#xff0c;删除&#xff0c;修改&#xff0c;查询 具体来说是一种接口代码,公共方法的接口类。 在dao层新建basedao,其他dao层接口继承basedao 相…

《VulnHub》Lampião:1

title: 《VulnHub》Lampio&#xff1a;1 date: 2024-03-28 21:37:49 updated: 2024-03-28 21:37:50 categories: WriteUp&#xff1a;Cyber-Range excerpt: 关键技术&#xff1a;主机发现&#xff0c;端口扫描、服务探测、操作系统探测&#xff0c;对开放的端口探测漏洞&#x…

正弦实时数据库(SinRTDB)的使用(5)-历史数据查询

前文已经将正弦实时数据库的使用进行了介绍&#xff0c;需要了解的可以先看下面的博客&#xff1a; 正弦实时数据库(SinRTDB)的安装 正弦实时数据库(SinRTDB)的使用(1)-使用数据发生器写入数据 正弦实时数据库(SinRTDB)的使用(2)-接入OPC DA的数据 正弦实时数据库(SinRTDB)…

民航电子数据库:查询cae服务存在哪些数据库以及删除数据库

目录 一、场景二、查询数据库列表三、删除数据库 一、场景 1、对接民航电子数据库 2、在CAEManage是没有直观展示已存在的数据库的&#xff0c;只能通过SQL查询 3、在CAEManage没有操作按钮可以删除数据库&#xff0c;只能通过SQL进行删除 二、查询数据库列表 1、登录SYSTE…

我是如何在学术界占有一席之地的——专注于我的写作

罗伯特纽贝克 “作为一个移民&#xff0c;你是怎么发表这么多文章的&#xff1f;”意识到我不是以英语为母语的人&#xff0c;当我去年面试教职时&#xff0c;人们无数次问过这个问题。我知道披露我的挣扎不太可能让我找到工作&#xff0c;所以我会笑着说&#xff1a;“我喜欢…

Xinstall广告效果监测,为您的App推广保驾护航

在当前的移动互联网时代&#xff0c;App已经成为企业与用户连接的重要桥梁。然而&#xff0c;App推广过程中&#xff0c;如何准确衡量广告效果、洞悉推广效果以及优化用户体验&#xff0c;一直是广告主和开发者面临的挑战。这时&#xff0c;一款强大而专业的App全渠道统计服务商…

蓝桥杯刷题第四天

思路&#xff1a; 这道题很容易即可发现就是简单的暴力即可完成题目&#xff0c;我们只需满足所有数的和为偶数即可保证有满足条件的分法&#xff0c;同时也不需要存下每个输入的数据&#xff0c;只需要知道他是偶数还是奇数即可&#xff0c;因为我们只需要偶数个奇数搭配在一块…

Manjaro 安装全新 Linux 版微信,从此告别 Wine

目前已经基本上使用 Manjaro 来工作&#xff0c;而工作离不开微信作为日常的工作沟通工具。因为微信官方一直没有 Linux 版本的&#xff0c;所以之前都只能够使用 Wine 版本&#xff0c;然后踩了不少坑&#xff0c;但还算能勉强使用。 最近听说微信终于要发布 Linux 版本的&am…

day22.二叉树part08

day22.二叉树part08 235.二叉搜索树的最近公共祖先 原题链接 代码随想录链接 思路&#xff1a;因为本题是二叉搜索树&#xff0c;利用它的特性可以从上往下进行递归遍历树&#xff0c;这里需要理解一点就是如果遍历到的一个节点发现该节点的值正好位于节点p和节点q的值中间…

ip地址改变导致nacos无法登录的解决方法

ip地址改变导致nacos无法登录的解决方法 在做黑马的springcloud课程里的黑马商城微服务项目时&#xff0c;发现使用nacos的默认账号密码&#xff08;nacos&#xff0c;nacos&#xff09;无法登录&#xff0c;项目里也没报错信息&#xff0c;虽然猜测和ip地址改变有关&#xff0…

视频素材免费无水印软件有哪些?视频素材免费下载素材库

在这个视觉为王的时代&#xff0c;一段精彩的视频能够跨越语言和文化的障碍&#xff0c;触动每一个心灵。对于每一位热血沸腾的视频创作者而言&#xff0c;寻找那些高质量无水印的素材&#xff0c;就像是在无尽的创意海洋中航行&#xff0c;在这段旅程中&#xff0c;我为你精选…

银行监管报送系统介绍(八):银行业大额交易和可疑交易报告数据报送

依据《金融机构大额交易和可疑交易报告管理办法》&#xff1a; 第五条 金融机构应当报告下列大额交易&#xff1a; &#xff08;一&#xff09;当日单笔或者累计交易人民币5万元以上&#xff08;含5万元&#xff09;、外币等值1万美元以上&#xff08;含1万美元&#xff09;的…

尾盘拉升超8个点,速腾聚创交出来一份怎样的超预期答卷?

“如果说2024年是智驾加速渗透&#xff0c;L3级智能驾驶陆续落地的一年&#xff0c;那么激光雷达将是这股潮流中不可缺失的那一份。” 2024年开年&#xff0c;速腾聚创以相当“闪亮的姿态”成为“港股2024年首只IPO上市成功”的企业。 然而&#xff0c;其上市之后的市场表现却…

Unity 渲染

渲染的三个阶段 1&#xff1a;应用阶段 1.1 数据的准备 遮挡剔除&#xff0c;层级剔除。 渲染顺序&#xff0c;UI在Herachy窗口按照层级渲染&#xff0c;其余物体由大概按照先近后远。 打包渲染数据发送给显存&#xff0c;主要包括有模型信息&#xff0c;变换矩阵&#xff0c…