【Linux】进程间关系与守护进程
进程间关系与守护进程
- 1 进程组
- 2 会话
- 3 控制终端
- 4 作业控制
- 5 守护进程
1 进程组
之前我们提到了进程的概念, 其实每一个进程除了有一个进程 ID(PID)之外 ,还属于一个进程组。 进程组是一个或者多个进程的集合, 一个进程组可以包含多个进程。 每一个进程组也有一个唯一的进程组 ID(PGID), 并且这个 PGID 类似于进程 ID, 同样是一个正整数, 可以存放在 pid_t 数据类型中!
我们现在启动一些程序sleep 1000 | sleep 2000 | sleep 3000
,可以来看看:
这三个sleep
进程就属于同一个进程组,进程组PGID是34379!他们的PPID是bash,都是34345!
同样的通过fork创建的父子进程也是属于同一个进程组:
#include <iostream>
#include <sys/types.h>
#include <unistd.h>int main()
{int n = fork();if(n == 0){while(true){std::cout << "I am Child process ,PID: "<< getpid() <<std::endl;sleep(1);}}std::cout << "I am Parent process ,PID: "<< getpid() <<std::endl;sleep(100);return 0;
}
每一个进程组都有一个组长进程。 组长进程的 ID 等于其进程 ID。 我们可以通过 ps 命令看到组长进程!
- 进程组组长的作用: 进程组组长可以创建一个进程组或者创建该组中的进程
- 进程组的生命周期: 从进程组创建开始到其中最后一个进程离开为止。 注意:主要某个进程组中有一个进程存在, 则该进程组就存在, 这与其组长进程是否已经终止无关。
2 会话
提到了会话,我们先来谈一谈我们平时是怎么通过Xshell进行登录的。每当我们通过Xshell客户端正确的登录到Linux系统后,系统会给我们创建一个终端文件,并且配套一个bash进程(进程组的形式)!我们写的命令写入到终端文件,然后通过bash进程执行在返回结果。
我们来看看系统是不是会在我们登录时创建一个终端文件,并且配套一个bash进程
可以看到我们每次打开一个新的的会话,就会产生一个对应的bash文件!终端文件也是如此:
刚刚我们谈到了进程组的概念, 那么会话又是什么呢? 会话其实和进程组息息相关,会话可以看成是一个或多个进程组的集合, 一个会话可以包含多个进程组。 每一个会话也有一个会话 ID(SID),一般是会话的第一个进程操PID。
通常我们都是使用管道将几个进程编成一个进程组
可以调用 setseid 函数来创建一个会话, 前提是调用进程不能是一个进程组的组长。
include <unistd.h> //功能: 创建会话 //返回值: 创建成功返回 SID, 失败返回-1 pid_t setsid(void);
该接口调用之后会发生:
- 调用进程会变成新会话的会话首进程。 此时,新会话中只有唯一的一个进程
- 调用进程会变成进程组组长。 新进程组 ID 就是当前调用进程 ID
- 该进程没有控制终端。 如果在调用setsid 之前该进程存在控制终端, 则调用之后会切断联系
上边我们提到了会话 ID, 那么会话 ID 是什么呢? 我们可以先说一下会话首进程, 会话首进程是具有唯一进程 ID 的单个进程, 那么我们可以将会话首进程的进程 ID 当做是会话 ID。
注意: 会话 ID 在有些地方也被称为 会话首进程的进程组 ID, 因为会话首进程总是一个进程组的组长进程, 所以两者是等价的。
3 控制终端
先说一下什么是控制终端?
在 UNIX 系统中, 用户通过终端登录系统后得到一个 Shell 进程, 这个终端成为 Shell进程的控制终端。 控制终端是保存在 PCB 中的信息, 我们知道 fork 进程会复制 PCB中的信息, 因此由 Shell 进程启动的其它进程的控制终端也是这个终端。 默认情况下没有重定向, 每个进程的标准输入、 标准输出和标准错误都指向控制终端, 进程从标准输入读也就是读用户的键盘输入, 进程往标准输出或标准错误输出写也就是输出到显示器上。 另外会话、 进程组以及控制终端还有一些其他的关系。
我们在下边详细介绍一下:
- 一个会话可以有一个控制终端, 通常会话首进程打开一个终端(终端设备或伪终端设备) 后, 该终端就成为该会话的控制终端。
- 建立与控制终端连接的会话首进程被称为控制进程。
- 一个会话中的几个进程组可被分成一个前台进程组以及一个或者多个后台进程组。
- 如果一个会话有一个控制终端, 则它有一个前台进程组, 会话中的其他进程组则为后台进程组。
- 无论何时进入终端的中断键(ctrl+c) 或退出键(ctrl+\) , 就会将中断信号发送给前台进程组的所有进程。
- 如果终端接口检测到调制解调器(或网络) 已经断开, 则将挂断信号发送给控制进程(会话首进程) 。
通常我们执行程序,都是在前台进行运行的。当我们在启动程序后加入&
就会在后台运行程序。
在同一个会话中可以运行同时存在多个进程组,但是,任何时刻,只允许一个前台进程组,可以运行多个后台进程组!需要注意的是只有前台进程组可以获取到标准输入!后台不能获取标准输入!
4 作业控制
作业在Linux环境中,是指为完成用户指定任务而启动的一组进程。一个作业可能仅包含单一进程,也可能由多个相互协作的进程构成,这些进程通常通过管道机制进行通信。
在Shell的管理下,控制单元并非单个进程,而是作业或进程组。前台作业可能由多个进程联合执行,同样,后台作业也可以由一系列进程共同构成。Shell能够同时管理一个前台作业和多个后台作业,这种能力我们称之为作业控制。通过这种方式,用户可以在不中断前台操作的前提下,有效地调度和监控后台任务。
我们来看:[作业号] 进程组长pid
我们来看看详细的信息,可以看到正在Runing。
- 我们可以通过
fg 作业号
将后台作业移动到前台
- 放到后台,首先需要将前台作业暂停,又因为Linux系统不允许前台有暂停的作业,系统就会把其移动到后台。所以我们通过
ctrl + z
暂停进程就将其放回到后台了,然后再通过bg 作业号
启动就可以了!
来看一下作业的状态:
状态名称 | 描述 |
---|---|
运行中 Running | 作业正在执行。 |
暂停 Suspended | 作业被挂起,等待继续执行。 |
停止 Stopped | 作业已经结束执行。 |
后台运行 Background | 作业在后台执行,不占用命令行界面。 |
前台运行 Foreground | 作业在前台执行,用户必须等待其完成后才能进行其他操作。 |
已完成 Completed | 作业成功执行完毕。 |
已终止 Terminated | 作业因错误或其他原因被强制终止。 |
等待中 Waiting | 作业正在等待系统资源或其他作业的完成。 |
在Linux中,作业状态的产生如下:
- 运行中 (Running):作业启动后立即执行。如果作业是前台作业,它将直接占用命令行界面。如果作业是后台作业,它将在后台运行,不占用命令行界面。
- 暂停 (Suspended):通过
Ctrl+Z
暂停前台作业。暂停的作业可以通过bg命令将其放入后台,或者通过fg命令将其恢复到前台运行。 - 停止 (Stopped):作业自然完成或因错误结束。
- 后台运行 (Background):命令后加
&
或使用bg
命令。 - 前台运行 (Foreground):默认启动方式或使用
fg
命令。 - 已完成 (Completed):作业成功执行完毕。在这个状态下,作业已经结束,不再运行。
- 已终止 (Terminated):作业由于接收到终止信号(如SIGTERM或SIGKILL)而被强制结束。
- 等待中 (Waiting):作业等待资源或事件。
5 守护进程
守护进程,又称为Daemon:守护进程是一种在操作系统后台运行的进程,它通常在系统启动时开始运行,并在系统关闭时终止。它独立于任何控制终端,不会因为用户登录或注销而受到影响。守护进程通常用于执行系统级别的任务,如网络服务、系统监控、日志记录等,它们默默地工作,不需要用户直接交互,确保了系统服务的持续性和稳定性。
那么守护进程是怎么实现的?
- 首先,我们通过Xshell连接终端时,会产生新的会话,我们创建所有进程组也一定属于这个会话!进程组无论是前台还是后台,都是属于同一个会话!
- 然后,只有是一个会话内的进程组,就会收到用户登录或注销而受到影响。而守护进程想要不受影响就要单独创建一个会话!
- 形成独立的会话之后,这个会话里只有这一个进程组,那么其他用户的登录和注销就不会影响了!
对于守护进程,每一个程序员实现守护进程的方法可能都不太一样,这里只展示最基础的实现方法:
const char *root = "/";
const char *dev_null = "/dev/null";//这类似一个黑洞 不会储存信息!void Daemon(bool ischdir, bool isclose)
{// 1. 忽略可能引起程序异常退出的信号signal(SIGCHLD, SIG_IGN);signal(SIGPIPE, SIG_IGN);// 2. 注意进程组组长不能进行创建会话,所以让自己不要成为组长if (fork() > 0)exit(0);// 3. 设置让自己成为一个新的会话, 后面的代码其实是子进程在走setsid();// 4. 每一个进程都有自己的 CWD,是否将当前进程的 CWD 更改成为 / 根目录if (ischdir)chdir(root);// 5. 已经变成守护进程啦, 不需要和用户的输入输出,错误进行关联if (isclose){close(0);close(1);close(2);}else{// 这里一般建议就用这种//进行重定向int fd = open(dev_null, O_RDWR);if (fd > 0){dup2(fd, 0);dup2(fd, 1);dup2(fd, 2);close(fd);}}
}
这样就设置好了守护进程!!!
相关文章:

【Linux】进程间关系与守护进程
超出能力之外的事, 如果永远不去做, 那你就永远无法进步。 --- 乌龟大师 《功夫熊猫》--- 进程间关系与守护进程 1 进程组2 会话3 控制终端4 作业控制5 守护进程 1 进程组 之前我们提到了进程的概念, 其实每一个进程除了有一个进程 ID(P…...

【可视化大屏】将柱状图引入到html页面中
到这里还是用的死数据,先将柱状图引入html页面测试一下 根据上一步echarts的使用步骤,引入echarts.js后需要初始化一个实例对象,所以新建一个index.js文件来进行创建实例化对象和配置数据信息等。 //在index.html引入<script src"j…...

gm/ID设计方法学习笔记(一)
前言:为什么需要gm/id (一)主流设计方法往往侧重于强反型区(过驱>0.2V),低功耗设计则侧重于弱反型区(<0),但现在缺乏对中反型区的简单和准确的手算模型。 1.对于…...
高度细化的SAGA模式实现:基于Spring Boot与RabbitMQ的跨服务事务
场景与技术栈 场景:电商系统中的订单创建流程,涉及订单服务(Order Service)、库存服务(Inventory Service)、支付服务(Payment Service)。 技术栈: Java 11 Spring Bo…...

Vue工程化开发
Vue工程化开发 一、工程化开发和脚手架 1.开发Vue的两种方式 核心包传统开发模式:基于html / css / js 文件,直接引入核心包,开发 Vue。工程化开发模式:基于构建工具(例如:webpack)的环境中开…...

Ray_Tracing_The_Next_Week下
5image Texture Mapping 图像纹理映射 我们之前虽然在交点信息新增了uv属性,但其实并没有使用,而是通过p交点笛卡尔坐标确定瓷砖纹理或者大理石噪声纹理的值 现在通过uv坐标读取图片,通过std_image库stbi_load(path)…...

ES索引生命周期管理
基于如何 定时删除ES索引过期数据 而引发的一系列关于ES索引生命周期管理ILM(Index Lifecycle Management)的学习 快速上手 :定时删除ES索引中的过期数据 1. ILM解决什么问题? ES从6.7版本引入ILM,通过ILM可以解决哪些问题呢? 自动新建…...

Oracle数据库体系结构基础
关于Oracle体系结构 基于Oracle11g体系结构 目标: 了解Oracle体系结构掌握逻辑存储结构掌握物理存储结构熟悉Oracle服务器结构熟悉常用的数据字典 Oracle数据库管理中的重要的三个概念 实例(instance):实例是指一组Oracle后台进程以及在服务器中分配…...
QT学习笔记4.5(文件、参数文件)
QT学习笔记4.5(文件、参数文件) 1.保存配置参数 1.使用QSettings保存到注册表,ini文件 2.文件存储:使用 QFile 和其他类将参数保存到文本文件、二进制文件、XMLWENJIAN、JSON 文件等。 文本文件:以简单的键值对格式…...
服务器虚拟化的详细学习要点
服务器虚拟化的详细学习要点可以归纳为以下几个方面: 1. 基本概念与原理 定义与原理:了解服务器虚拟化是一种将物理服务器资源转化为虚拟服务器资源的技术,允许在一台物理服务器上运行多个虚拟服务器。 虚拟化层次:理解虚拟化的不同层次,如裸机虚拟化(Type 1)和托管虚…...

创建一个Java Web API项目
创建一个Java Web API涉及多个步骤和技术栈,包括项目设置、依赖管理、数据访问层实现、业务逻辑实现、控制层开发以及测试和部署。在这篇详解中,我将带领你通过一个完整的Java Web API实现流程,采用Spring Boot和MyBatis-Plus作为主要技术工具…...
对称加密算法的使用Java和C#
1. JAVA中的使用 1.1.原生使用 Main函数代码 import symmetric_encryption.AESExample; import symmetric_encryption.BlowfishExample; import symmetric_encryption.DESExample; import symmetric_encryption.TripleDESExample; public class App { public static…...

10款好用的开源 HarmonyOS 工具库
大家好,我是 V 哥,今天给大家分享10款好用的 HarmonyOS的工具库,在开发鸿蒙应用时可以用下,好用的工具可以简化代码,让你写出优雅的应用来。废话不多说,马上开整。 1. efTool efTool是一个功能丰富且易用…...
ubuntu22.04中备份Iptables的设置
在 Ubuntu 22.04 中备份 iptables 的设置,您可以采用以下几种方法: 使用 iptables-save 命令: 您可以使用 iptables-save 命令将当前的 iptables 规则保存到文件中。例如,要将规则保存到 /etc/iptables/rules.v4 文件中࿰…...

(PyTorch) 深度学习框架-介绍篇
前言 在当今科技飞速发展的时代,人工智能尤其是深度学习领域正以惊人的速度改变着我们的世界。从图像识别、语音处理到自然语言处理,深度学习技术在各个领域都取得了显著的成就,为解决复杂的现实问题提供了强大的工具和方法。 PyTorch 是一个…...

若依从redis中获取用户列表
因为若依放入用户的时候,会在减值中添加随机串,所以用户的key会在redis中变成: login_tokens:6af07052-b76d-44dd-a296-1335af03b2a6 这样的样子。 如果用 Set<Object> items redisService.redisTemplate.keys("login_tokens&…...

文件上传之%00截断(00截断)以及pikachu靶场
pikachu的文件上传和upload-lab的文件上传 目录 mime type类型 getimagesize 第12关%00截断, 第13关0x00截断 差不多了,今天先学文件上传白名单,在网上看了资料,差不多看懂了,但是还有几个地方需要实验一下&#…...

Chainlit集成LlamaIndex并使用通义千问实现和数据库交互的网页对话应用(text2sql)
前言 我在之前的几篇文章中写了如何使用Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用,但是发现Langchain的几种和数据库交互的组件都不够让我满意,虽然已经满足了大部分场景的需求,但是问题还是很多,比如…...

计组复习笔记
计组笔记 汇编部分 通用寄存器(General Registers): AX (Accumulator): 用于累加运算,也是乘法和除法的默认寄存器。BX (Base Register): 可以用作一个基址寄存器,通常用于存放数据的基地址。CX (Counter Register): 通常用于循环…...
62. 环境贴图2
环境贴图作用测试 实际生活中光源照射到一个物体上,这个物体反射出去的光线也会影响其他的物体,环境贴图就是用一种简单方式,近似模拟一个物体周边环境对物体表面的影响。 测试:对于PBR材质,如果threejs三维场景不添…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...