进程关系与守护进程全解析

进程关系和守护进程

进程组

每一个进程除了有一个进程ID(PID)之外还属于一个进程组。进程组是一个或者多个进程的集合, 一个进程组可以包含多个进程,每一个进程组也有一个唯一的进程组ID(PGID), 并且这个PGID 类似于进程ID, 同样是一个正整数, 可以存放在 pid_t 数据类型中

每一个进程组都有一个组长进程。组长进程的ID 等于其进程ID,可以通过ps 命令看到组长进程的

Shell
[node@localhost code]$ ps -o pid,pgid,ppid,comm | cat
# 输出结果
PID PGID PPID COMMAND
2806 2806 2805 bash
2880 2880 2806 ps
2881 2880 2806 cat

从结果上看ps进程的PIDPGID相同,那也就是说明ps进程是该进程组的组长进程, 该进程组包括pscat两个进程

进程组组长的作用:进程组组长可以创建一个进程组或者创建该组中的进程

进程组的生命周期:从进程组创建开始到其中最后一个进程离开为止。注意:主要某个进程组中有一个进程存在, 则该进程组就存在, 这与其组长进程是否已经终止无关,只有当进程组中的最后一个进程退出时,进程组才会退出

会话

当 Linux 收到用户登录的请求时,会对该用户进行鉴权,成功登录后,就会给这个用户创建一个终端文件,这个终端文件是伪终端文件,是内核动态创建的,位于/dev/pts 目录下,不是物理设备文件,该终端用于接收用户输入和输出结果,同时还会给这个终端关联一个 bash 进程,用户向 bash 进程发送命令时,终端文件会接收到,然后发送给 bash 进程,bash 进程将命令解析后再发送回终端文件,创建终端文件和启动 bash 进程的过程就叫做构建了一个会话

命令的传输过程:

会话可以看成是一个或多个进程组的集合, 一个会话可以包含多个进程组。每一个会话也有一个会话ID(SID),会话ID 在有些地方也被称为会话首进程的进程组ID, 因为会话首进程总是一个进程组的组长进程, 所以两者是等价的,只能有一个前台进程(组),但是可以允许多个后台进程(组),前台进程可以从标准输入中获取数据,而后台进程则不可以

通常是通过管道将几个进程编进一个进程组的:

sleep 10 | sleep 20 | sleep 30

当关闭终端时,这个终端的会话也就会被关闭,会话中的进程组可能会退出,也可能不会,但是一定都会受到影响

  • 一个会话可以有一个控制终端,通常会话首进程打开一个终端(终端设备或伪终端设备)后,该终端就成为该会话的控制终端
  • 建立与控制终端连接的会话首进程被称为控制进程
  • 一个会话中的几个进程组可被分成一个前台进程组以及一个或者多个后台进程组
  • 如果一个会话有一个控制终端,则它有一个前台进程组,会话中的其他进程组则为后台进程组。
  • 无论何时进入终端的中断键(ctrl+c)或退出键(ctrl+\),就会将中断信号发送给前台进程组的所有进程。
  • 如果终端接口检测到调制解调器(或网络)已经断开,则将挂断信号发送给控制进程(会话首进程)

创建会话

可以调用setseid函数来创建一个会话, 前提是调用进程不能是一个进程组的组长

pid_t setsid(void);
返回值:创建成功返回SID, 失败返回-1

调用进程会变成新会话的会话首进程。此时, 新会话中只有唯一的一个进程,调用进程会变成进程组组长。新进程组ID 就是当前调用进程ID,该进程没有控制终端。如果在调用setsid 之前该进程存在控制终端, 则调用之后会切断联系

这个接口如果调用进程原来是进程组组长,则会报错,为了避免这种情况,我们通常的使用方法是先调用fork 创建子进程,父进程终止,子进程继续执行, 因为子进程会继承父进程的进程组ID,而进程ID 则是新分配的,就不会出现错误的情况

不关闭文件描述符的情况下使进程忽略对应文件描述符的信息:在 Linux 中有一个 dev/null,这个文件会将所有传入的信息忽略,因此可以将其他文件描述符重定向到这个文件描述符

int fd=open(dev_null,O_RDWR);
dup2(fd,0);
dup2(fd,1);
dup2(fd,2);
close(fd);

作业控制

作业是针对用户来讲,用户完成某项任务而启动的进程,一个作业既可以只包含一个进程,也可以包含多个进程,进程之间互相协作完成任务, 通常是一个进程管道

Shell 分前后台来控制的不是进程而是作业或者进程组。一个前台作业可以由多个进程组成,一个后台作业也可以由多个进程组成,Shell 可以同时运⾏一个前台作业和任意多个后台作业,这称为作业控制

在命令的后面加上一个&表示将进程后台运行,此时会显示命令的相关信息,通过 jobs 命令可以查看到这个作业,通过 fg 命令可以将后台的进程从后台放到前台运行,但是前台的进程需要先使用ctrl+z让进程暂停,然后再使用 bg命令将其放入到后台

fg 命令的相关参数

注意: 当通过fg 命令切回作业时,若没有指定作业参数,此时会将默认作业切到前台执行,即带有“+”的作业号的作业

直接通过输入jobs 命令查看本用户当前后台执⾏或挂起的作业

参数-l 则显示作业的详细信息

参数-p 则只显示作业的PID

sleep 100 | sleep 200 | sleep 300&
[1] 44210
#这里的1就是作业号,通过这个作业号对进程进行控制,后面的为进程组的id,也就是整个进程组第一个进程的id
fg 1
#将1号进程放到前台运行,此时可以接收到键盘的输入
#想要放回到后台,需要先使用ctrl+z将进程暂停,然后使用bg 1将进程放回后台
作业状态

作业控制相关的信号

Ctrl + C: 中断字符, 会产生SIGINT 信号

Ctrl + \: 退出字符, 会产生SIGQUIT 信号

Ctrl + Z:挂起字符, 会产生STGTSTP 信号

守护进程

将进程守护进程化:

std::string path="/";
std::string dir="dev/null";
void Daemon(bool isclose,bool ischdir)
{signal(SIGCHLD,SIG_IGN);signal(SIGPIPE,SIG_IGN);if(fork()>0)exit(1);setsid();if(ischdir){chdir(dir.c_str());}if(isclose){::close(0);::close(1);::close(2);}else{int fd=open(dir.c_str(),O_RDWR);dup2(fd,0);dup2(fd,1);dup2(fd,2);close(fd);}
}

将服务守护进程化

在启动服务前启动守护进程

int main(int argc, char *argv[])
{if (argc != 2){std::cout << "Usage : " << argv[0] << " port" <<std::endl;return 0;}uint16_t localport = std::stoi(argv[1]);Daemon(false, false);std::unique_ptr<TcpServer> svr(new TcpServer(localport,HandlerRequest));svr->Loop();return 0;
}

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

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

相关文章

PyAutoGUI 测试框架

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】

Git安装避坑指南

Git高速下载 程序员面试资料大全&#xff5c;各种技术书籍等资料-1000G 一、安装前准备&#xff1a;避免环境冲突 1. 检查系统残留&#xff08;Windows&#xff09; # 检查旧版Git残留 where git where git.exe# 检查环境变量 $env:PATH -split ; | Select-String git# 清理…

MATLAB中的并行加速技术与工具

文章目录 MATLAB中的并行加速技术与工具1. 多线程计算&#xff08;隐式并行&#xff09;2. Parallel Computing Toolbox (并行计算工具箱)2.1 parfor (并行for循环)2.2 spmd (单程序多数据)2.3 parfeval (异步并行执行) 3. GPU计算4. 分布式计算 (MATLAB Parallel Server)5. 批…

GR00T N1.5 技术报告 -- Nvidia -- 2025.6.11 -- 开源

0. 前言 GR00T N1 的详细介绍 Isaac-GR00T 在6.11 进行了全面升级&#xff0c;从 N1 进化为 N1.5&#xff0c;但基本还是基于之前的架构&#xff0c;官方发布了一个技术报告&#xff0c;并更新了github库&#xff0c;之前的N1也做了独立版本 N1 N 1.5 github 技术报告 model…

SRS WebRTC 入门

什么是 SRS WebRTC? SRS (Simple Realtime Server) 是一个支持 WebRTC 流媒体的开源媒体服务器。它允许你建立基于 WebRTC 的低延迟直播和实时通信应用。 快速开始 1. 安装 SRS bash # 使用 Docker 快速安装 docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080…

从手机随拍到标准扫描件:AI如何智能校正证件照片(Python+OpenCV)

目录 一、概述二、解决方案2.1 核心挑战&#xff1a;AI眼中的“三座大山”2.2 设计思路&#xff1a;给AI一个“智能提示”2.3 实现流程&#xff1a;四步搞定 三、代码实现3.1 依赖库3.2 代码 四、结语 一、概述 在当今的线上业务中&#xff0c;要求用户上传身份证、驾驶证等证…

基于OpenCV图像分割与PyTorch的增强图像分类方案

在图像分类任务中&#xff0c;背景噪声和复杂场景常常会对分类准确率产生负面影响。为了应对这一挑战&#xff0c;本文介绍了一种结合OpenCV图像分割与PyTorch深度学习框架的增强图像分类方案。通过先对图像进行分割提取感兴趣区域&#xff08;Region of Interest&#xff0c;R…

华为云对象存储OBS 支持安卓/iOS/鸿蒙UTS组件

华为云对象存储OBS 支持安卓/iOS/鸿蒙UTS组件 介绍使用前须知vue代码调用示例权限说明API调用说明初始化配置&#xff08;openClient&#xff09;创建桶&#xff08;createBucket&#xff09;列举桶&#xff08;listBuckets&#xff09;删除桶&#xff08;deleteBucket&#xf…

Buildroot 2025.05 中文手册【AI高质量翻译】

译文在 Github 仓库 和 Gitee 仓库 保持最新&#xff0c;其它平台发的文档可能不会与之同步。 希望能够共同维护这个 仓库的 Buildroot 手册 中文译文&#xff0c;帮助更多人真正深入学习理解&#xff0c;更好的工作、生活和创造。 关于 AI 提示词 以及 更多工具 的收集&#…

采用ArcGIS10.8.2 进行插值图绘制

一、最终成果图展示 二、软件下载 链接: 百度网盘 请输入提取码 密码:azay 三、软件安装 1、在安装之前需要关闭电脑的防火墙及杀毒软件 设置-隐私和安全性-Windows安全中心-防火墙和网络保护 2、软件解压 (1)【ArcGIS_Desktop_1082_180......】“以管理员身份运行”…

Python网安-zip文件暴力破解(仅供学习)

目录 源码在这里 需要的模块 准备一个密码本和需要破解的ZIP文件 一行一行地从密码文件中读取每个密码。 核心部分 注意&#xff0c;需要修改上段代码注释里的这段具有编码问题的代码&#xff1a; 源码在这里 https://github.com/Wist-fully/Attack/tree/cracker 需要的…

如何让ChatGPT模仿人类写作,降低AIGC率?

在AI技术日益普及的当下&#xff0c;ChatGPT 等大语言模型已成为许多学术与写作任务中的得力助手。然而&#xff0c;学境思源&#xff0c;随着各类“AI检测系统”的出现&#xff0c;一键生成论文初稿&#xff01;我们也遇到一个新的问题&#xff1a;如何让AI写作看起来不像AI写…

科大讯飞2025AI开发者大赛-用户新增赛道时间规则解析

根据训练集中的时间规则&#xff0c;对测试集中的数据推断用户标签&#xff08;新用户或老用户&#xff09;。 时间规则如下: 针对训练集和测试集中都存在的did&#xff1a; 找到在训练集中标记为新用户最晚的时间点&#xff0c;则测试集中对应did的数据在此时间点前全部为新用…

.NET C# async/定时任务的异步线程池调度方案最大线程数‌ = 处理器核心数 × 250

关于.NET中Threading.Timer的线程机制&#xff0c;结合线程池特性和异步协作原理分析如下&#xff1a; 一、线程复用机制 ‌共享进程级线程池‌ Threading.Timer的回调任务‌不会每次新建线程‌&#xff0c;而是提交到.NET进程全局线程池统一调度&#xff0c;该线程池与async/…

Redis 高可用分片集群:主从模式与哨兵机制详解

一、为何需要分片集群&#xff1f; 在讨论具体方案之前&#xff0c;我们先明确分片集群要解决的问题&#xff1a; 单节点瓶颈&#xff1a;无论是内存容量还是处理能力&#xff08;QPS&#xff09;&#xff0c;单个 Redis 实例都有物理上限。高可用性需求&#xff1a;单点故障…

Qt readyRead信号避坑:不产生readyRead信号的解决方法

Qt readyRead信号避坑&#xff1a;不产生readyRead信号的解决方法 引言一、QSerialport的readyRead1.1 版本问题1.2 缓存问题1.3 阻塞问题 二、Q(Tcp)Socket的readyRead2.1 阻塞问题2.2 运行一段时间&#xff0c;突然不发信号2.3 和具体数据有关&#xff1f; 引言 目前没遇到相…

大事件项目记录10-文章分类接口开发-更新文章分类

四、更新文章分类。 CategoryController.java&#xff1a; PutMappingpublic Result update(RequestBody Validated Category category){categoryService.update(category);return Result.success();} CategoryService&#xff1a; //更新分类void update(Category category); …

AI接口使用–阿里云百炼

原文地址&#xff1a;AI接口使用–阿里云百炼 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 最近开发了一个抖音AI起名小程序&#xff0c;已经在抖音上线了&#xff0c;欢迎大家来使用。其中用到了 AI文本生成 功能&#xff0c;我用的是 阿里云…

大模型之提示词工程入门——解锁与AI高效沟通的“钥匙”

一、什么是提示词工程&#xff1f; 提示词工程&#xff08;Prompt Engineering&#xff09; 是一门通过设计、优化输入文本&#xff08;Prompt&#xff09;来引导大语言模型&#xff08;LLM&#xff09;生成高质量输出的技术。它不仅是AI应用的核心环节&#xff0c;也是连接人…

智慧城市云计算大数据中心项目设计方案

第1章 总体方案设计 1.1 概述 1.2 建设目标 1.3 建设内容 1.3.1 标准规范体系编制 1.3.2 基础设施平台建设 1.3.3 数据资源平台建设 1.3.4 应用支撑平台建设 1.3.5 云管平台运维建设 1.3.6 应用上云迁移实施 1.3.7 信息安全保障建设 1.3.8 容灾备份系统建设 1.4 设…