进程守护化

文章目录

  • 概念引入
  • ps细节展示
    • 什么是进程组
    • 什么是会话
    • 细节演示
    • 有关指令的处理
  • 用户级任务和进程组的关系
    • 关系
    • 不同
  • 什么是守护进程
    • 如何创建守护进程
  • 代码说明
    • 如何关闭守护进程
  • 问题

概念引入

我们在之前的章节中已将看过进程相关的概念, 本篇介绍守护进程
进程还有进程组, 作业, 会话的概念
终端进程的启动父进程都是bash

ps细节展示

当我们在终端输入sleep10000, 查看这个进程相关的信息
在这里插入图片描述

其中的信息是
SID表示是会话
STAT表示状态
TTY表示是当前打开的终端是谁
UID表示用户身份, 当前sleep进程是以用户UID为1000的用户执行的进程
可以看到这个sleep进程的PIDPGID一样, 这样的进程自成进程组
进程的PIDPGID一样, 这样的进程自成进程组
进程组默认是在一个会话中的

什么是进程组

当输入指令 sleep 1000 | sleep 2000 | sleep 3000
同时启动的多个进程, 是属于同一个进程组的
在这里插入图片描述每次登陆Linux, 系统都会给用户提供,

  1. bash
  2. 提供一个终端, 用于给用户提供命令行解析服务

什么是会话

其中, 这个1和2在一起, 这个叫一个会话
在命令行中启动的所有的进程, 最终默认都是在当期会话内部的一个进程组(可以是一个进程自成为进程组)

当我们建立三个终端时, 此时查看bash进程
对于每一个bash都是自成进程组, 自成会话

在这里插入图片描述清理所有的任务, 首先执行sleep 100000
再执行, sleep 20000 |sleep 300000 | sleep 40000
再次查看进程信息

在这里插入图片描述
其中sleep 100000 是自成进程组, 自成会话
另外三个是为一组进程组, 但因为是同属一个终端的指令, 所以是属于一个会话
画图演示具体细节:

细节演示

在这里插入图片描述

有关指令的处理

1.jobs查看当前会话中的所有进程
2. ctrl + z将当前进程放在后台

  1. 放在后台的应用, 默认从1开始有作业编号
  2. 放在后台的进程, 默认会处于stopped, 可以使用bg %作业编号的方式, 恢复进程为running, 也可以使用bg, 不加编号, 默认是最近的一次被挂起(ctrl + z)的作业
  3. 使用指令fg %+作业编号的数字, 可以将任务放在前台, 也可以简单使用fg, 不加编号也行, 与上述同理

用户级任务和进程组的关系

关系

  1. 进程组: 技术方面的表述
  2. 用户级任务: 用户级概念

不同

每次启动Linux都会创建一个新的会话, 会话与会话之间是隔离的
在这里插入图片描述

每次启动的进程是受到用户登录和注销影响的, 如果这个进程出现异常, 那么有可能会导致这个bash会话被关闭, 这与OS的处理机制有关
现在想让我们的服务(进程), 不受用户的登录和注册影响, 那么只需要 把这个进程变成守护进程

什么是守护进程

  1. 守护进程是一个独立的会话
  2. 不隶属于任何一个bash会话

如何创建守护进程

使用setsid接口
在这里插入图片描述
进程在调用这个会话的时候, 该进程会自己成为一个会话, 未来这个会话中只有我自己
前提是, 这个进程不是进程组的组长, 组长一般是多个进程的第一个
所以要成功调用, 一般是创建子进程, 让父进程直接退出
即守护进程一定是孤儿进程, 他的父进程一定是bash进程(1)

代码说明

Deamon.hpp

#pragma once
#include <iostream>
#include <cstdlib>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>const char *root = "/";
const char *dev_null = "/dev/null";void Deamon(bool ischdir, int isclosefd)
{// 1.忽略可能引起进程异常的信号(取决于应用场景)signal(SIGCHLD, SIG_IGN);signal(SIGPIPE, SIG_IGN);// 2.让自己不要成为组长if (fork() > 0)exit(0); // 父进程退出// 3.设置让自己成为一个新的会话, 后面的代码是子进程在走setsid();// 4.每一个进程都有自己的CWD(PWD的路径), 是否将当前进程的CWD设置成根目录(好处是, 这样的顶级方式查找)// 1. 防止依赖临时文件// 守护进程通常不需要访问任何特定的文件或目录。如果守护进程在其启动时的工作目录中创建了临时文件或其他资源,可能会导致不必要的依赖。将 CWD 设置为根目录可以确保守护进程不会依赖于任何特定的工作目录。// 2. 避免权限问题// 如果守护进程在其启动时的工作目录中创建文件或修改文件,可能会遇到权限问题。例如,如果守护进程运行在非特权用户账户下,而该用户的家目录或工作目录可能不具备相应的写权限,这会导致守护进程无法正常工作。将 CWD 设置为根目录可以避免这些问题。// 3. 减少对系统的影响// 将 CWD 设置为根目录可以减少守护进程对其启动环境的依赖,从而减少其对系统的影响。这意味着守护进程不会意外地修改或依赖于其启动时的工作目录中的文件或目录。// 4. 便于管理和维护// 将 CWD 设置为根目录可以使守护进程的管理和维护更加简单。例如,如果守护进程需要在日志中记录其工作目录,将 CWD 设置为根目录可以确保日志的一致性和可预测性。// 5. 避免挂载点问题// 如果守护进程在其启动时的工作目录位于一个挂载点上(例如,一个可移动设备或网络文件系统),那么如果该挂载点变得不可用(例如,设备断开连接或网络中断),守护进程可能会出现问题。将 CWD 设置为根目录可以避免这些问题。if (ischdir)chdir(root); // 更改目录为根目录// 5.守护进程是一个独立的会话, 不需要和用户的输入输出进行关联, 关闭标准输入输出(不推荐, 万一真的存在从哪个文件读取输入到另一个文件, 此时就会出错)// 所以好的做法是使用 /dev/null, 向这个文件写入的任何东西都会丢弃, 读的时候读到文件结尾int fd = open(dev_null, O_RDWR);if (isclosefd) // 是否是直接关闭文件描述符的方式{close(0);close(1);close(2);}else // 重定向到null文件的形式{if (fd > 0){// int dup2(int oldfd, int newfd);dup2(fd, 0);dup2(fd, 1);dup2(fd, 2);close(fd);}}
}

main.cc

#include "Daemon.hpp"
#include <unistd.h>
int main()
{// 守护进程Deamon(false, false);// 要执行的核心代码while(1){sleep(1);}return 0;
}

结果演示
在这里插入图片描述
在这里插入图片描述
父进程为bash, 为一个会话组
其中, 这个tty为?, 表示终端无关性

当关闭这个终端, 再次启动查看, 他还是存在, 且信息表示的内容与当期一样
查看信息 ls /proc/3596 -l, 里面都是该守护进程系相关的信息
在这里插入图片描述
在查看这个fd文件夹查看文件描述符信息
在这里插入图片描述

如何关闭守护进程

那要停止这个守护进程就需要使用kill -9 ID, 更推荐使用信号处理机制, 在代码当中, 发送某个信号时, 首先会进行资源的安全关闭, 再进行退出操作, 这边就不再修改
当然相比上述的守护进程的启动, 更推荐使用这样的方式来启动
在这里插入图片描述
在这里插入图片描述

问题

  1. 系统有没有提供进程变为守护进程的方式呢?
    在这里插入图片描述
  2. 之前的tcpserver udpserver怎么转化为守护进程呢?
    以tcpserver为例:
    server是在Main.cc文件内的, 所以对此进行修改, 还要将名字改为tcp_serverd, 这样专业一点, 因为守护进程都是以d结尾的, 就像mysql 的服务叫做mysqld
    同时, tcpserver的日志显示是要保存在文件中更好一点的

综上, 这个代码可以为:
在这里插入图片描述
其他的不变, 这样一个服务器的雏形就有了
日志正常

在这里插入图片描述serverd启动正常, 服务正常
在这里插入图片描述
守护进程完成

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

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

相关文章

锐龙7 7800X3D与i7-14700K到底怎么选!其实很简单

从2022年的锐龙7 5800X3D到后来的锐龙7 7800X3D&#xff0c;笔者使用X3D处理器已有2年多的时间。站在自己的立场&#xff0c;我是非常希望游戏老鸟购买这类处理器的&#xff0c;并且也推荐了不少。 这里说的是老鸟&#xff0c;也就是比较懂电脑的玩家。 但是对于新手玩家而言&a…

Kali Linux 下载与安装手册

目录 Kali 是什么&#xff1f; 通过Kali官方网站下载 Kali 是什么&#xff1f; Kali Linux&#xff0c;前称BackTrack&#xff0c;是一个基于Debian的Linux发行版&#xff0c;专为数字取证和渗透测试而设计。它由Offensive Security Ltd.开发和维护&#xff0c;旨在为安全专…

HarmonyOS NEXT应用开发实战(二、封装比UniApp和小程序更简单好用的网络库)

网络访问接口&#xff0c;使用频次最高。之前习惯了uniapp下的网络接口风格&#xff0c;使用起来贼简单方便。转战到鸿蒙上后&#xff0c;原始网络接口写着真累啊&#xff01;目标让鸿蒙上网络接口使用&#xff0c;简单程度比肩uniapp&#xff0c;比Axios更轻量级。源码量也不多…

【Parsec】一款安全高效的远程桌面软件

Parsec 是一款远程桌面软件&#xff0c;它允许用户通过P2P&#xff08;点对点&#xff09;技术远程访问和控制另一台计算机。以下是Parsec的一些主要作用、安全私密性特点以及优缺点&#xff1a; 作用&#xff1a; 远程游戏&#xff1a;用户可以远程访问高性能PC进行游戏&am…

记一次pyc逆向

.py文件   源代码文件。   这是开发者编写的 Python 源代码文件&#xff0c;包含了可执行的 Python 代码。 .pyc文件   字节码文件。   Python 源文件&#xff08;.py&#xff09;在执行时会被编译为字节码&#xff0c;并存储在 __pycache__ 目录下&#xff0c;文件名通…

Halcon形态学

形态学图像处理&#xff08;简称形态学&#xff09;是指一系列处理图像形状特征的图像处理技术。 形态学的基本思想是利用一种特殊的结构元来测量或提取输入图像中相应的形状或特征&#xff0c;以便进一步进行图像分析和目标识别。本章节依次对腐蚀&#xff0c;膨胀&#xff0…

Nacos作为注册中心和配置中心

下载安装Nacos 下载地址&#xff1a;Nacos 下载后将这个.zip文件解压 windows系统双击运行startup.cmd 注意事项 一些较新的版本可能会启动时闪退&#xff0c;解决方法为记事本编辑startuo.cmd文件 修改set MODE "standalone" Nacos注册中心 引入依赖 <dep…

动态规划算法专题(六):回文串问题

目录 1、回文子串&#xff08;"引子题"&#xff09; 1.1 算法原理 1.2 算法代码 2、最长回文子串 2.1 算法原理 2.2 算法代码 3、分割回文串 IV&#xff08;hard&#xff09; 3.1 算法原理 3.2 算法代码 4、分割字符串 II&#xff08;hard&#xff09; 4…

Spring Boot教学资源库:开发者的成长之路

2 相关技术简介 2.1Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0c;任…

AI视频技术复活老照片-简单快捷

准备老照片 可在网上搜索“老照片”图片&#xff0c;选择人物背景全的图片 照片修复 腾讯的ARC Lab网站 https://arc.tencent.com/zh/ai-demos/faceRestoration 上传照片&#xff0c;修复后下载&#xff0c;会直接在浏览器中下载 AI视频生成 采用可灵网&#xff1a; http…

PGMP-05相关方

目录 1.主要内容 2.概括 3.相关方人员 1.主要内容 Stakeholders IdentificationStakeholders AnalysisStakeholders Engagement PlanningStakeholders EngagementStakeholder communications 2.概括 识别&#xff1a;产生相关方登记册&#xff0c;使用头脑风暴分析&#x…

深入理解Transformer的笔记记录(精简版本)----Seq2Seq → Seq2Seq with Attention

只要是符合类似的框架,都可以统称为 Encoder-Decoder 模型。 1、RNN RNN引入了隐状态h(hidden state)的概念,隐状态h可以对序列形的数据提取特征,接着再转换为输出。 x1,x2,x3,x4如: 自然语言处理问题。x1可以看做是第一个单词,x2可以看做是第二个单词,依次类推语音处…

2024 闽盾杯-黑盾赛道WP

CRYPTO 签到题-学会SM https://www.json.cn/encrypt/sm3 题目要求小写所以需要转换一下 或者脚本&#xff1a; import hashlib message "heidun2024" hash_object hashlib.new(sm3) hash_object.update(message.encode(utf-8)) hash_value hash_object.hexdigest(…

AI助力智慧农田作物病虫害监测,基于YOLOv9全系列【yolov9/t/s/m/c/e】参数模型开发构建花田作物种植场景下棉花作物常见病虫害检测识别系统

智慧农业是一个很大的应用市场&#xff0c;将当下如火如荼的AI模型技术与现实的农业生产场景相结合能够有效提升生产效率&#xff0c;农作物在整个种植周期中有很多工作需要进行&#xff0c;如&#xff1a;浇水、施肥、除草除虫等等&#xff0c;传统的农业作物种植生产管理周期…

带你走近CCV(一)

从事多媒体互动行业8年了&#xff0c;最近才想着自己可以独自写一个识别软件&#xff0c;应该说想把公司里的识别统统临摹一遍&#xff0c;这样在接外包的时候可以游刃有余了 什么是CCV&#xff1f; CCV是一个建立在openCV基础上的一个开源的架构&#xff0c;其全称是Communit…

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz(多数据源配置)

SpringBoot教程&#xff08;二十四&#xff09; | SpringBoot实现分布式定时任务之Quartz&#xff08;多数据源配置&#xff09; 前言多数据源配置引入aop依赖1. properties配置多数据源2. 创建数据源枚举类3. 线程参数配置类4. 数据源动态切换类5. 多数据源配置类HikariCP 版本…

Java基础(2) 之面向对象

文章目录 Java基础(2) 之面向对象1.对象2.类类的注意事项 3.this关键字4.构造器注意 5.封装性6.实体JavaBean实体类 7.成员变量和局部变量的区别8.staticstatic修饰成员变量static修饰成员方法static的注意事项工具类单例设计模式 9.代码块静态代码块实例代码块 10.继承权限修饰…

Springboot——使用poi实现excel动态图片导入解析

文章目录 前言依赖引入导入实现方式一方式二 前言 最近要实现一个导入导出的功能点&#xff0c;需要能将带图片的列表数据导出到excel中&#xff0c;且可以导入带图片的excel列表数据。 考虑到低代码平台的表头与数据的不确定性&#xff0c;技术框架上暂定使用Apache-POI。 …

java 自定义填充excel并导出

首先在resources下面放一个excel模板 1. 方法签名和请求映射 RequestMapping(value "/ExportXls") public ResponseEntity<byte[]> rwzcExportXls(HttpServletRequest request, RequestBody JSONArray jsonArray) throws IOException { RequestMapping(val…

ubuntu 开放 8080 端口快捷命令

文章目录 查看防火墙状态开放 80 端口开放 8080 端口开放 22端口开启防火墙重启防火墙**使用 xhell登录**&#xff1a; 查看防火墙状态 sudo ufw status [sudo] password for crf: Status: inactivesudo ufw enable Firewall is active and enabled on system startup sudo…