【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三维场景不添…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
