【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); 

该接口调用之后会发生:

  1. 调用进程会变成新会话的会话首进程。 此时,新会话中只有唯一的一个进程
  2. 调用进程会变成进程组组长。 新进程组 ID 就是当前调用进程 ID
  3. 该进程没有控制终端。 如果在调用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:守护进程是一种在操作系统后台运行的进程,它通常在系统启动时开始运行,并在系统关闭时终止。它独立于任何控制终端,不会因为用户登录或注销而受到影响。守护进程通常用于执行系统级别的任务,如网络服务、系统监控、日志记录等,它们默默地工作,不需要用户直接交互,确保了系统服务的持续性和稳定性。

那么守护进程是怎么实现的?

  1. 首先,我们通过Xshell连接终端时,会产生新的会话,我们创建所有进程组也一定属于这个会话!进程组无论是前台还是后台,都是属于同一个会话!
  2. 然后,只有是一个会话内的进程组,就会收到用户登录或注销而受到影响。而守护进程想要不受影响就要单独创建一个会话!
  3. 形成独立的会话之后,这个会话里只有这一个进程组,那么其他用户的登录和注销就不会影响了!

对于守护进程,每一个程序员实现守护进程的方法可能都不太一样,这里只展示最基础的实现方法:


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);}}
}

这样就设置好了守护进程!!!

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

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

相关文章

Django5 使用pyinstaller打包成 exe服务

首先&#xff1a;确保当前的django项目可以完美运行&#xff0c;再进行后续操作 python manage.py runserver第一步 安装 pyinstaller pip install pyinstaller第二步 创建spec 文件 pyinstaller --name manage --onefile manage.pypyinstaller&#xff1a;这是调用 PyInsta…

数据异质性与数据异构性的本质和举例说明

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 在现代数据科学与信息技术领域&#xff0c;“数据异质性” 与 “数据异构性” 是两个常见的概念。对于初学者而言&#xff0c;明确这两个概念的本质及其间的差异至关重要。本文旨在以简明易懂的方式&am…

Python笔记 - 利用装饰器设计注解体系

认识注解 注解&#xff08;Annotation&#xff09;是一种用于为代码添加元数据的机制。这些元数据可以在运行时被访问&#xff0c;用于为代码元素&#xff08;如类、方法、字段等&#xff09;提供额外的信息或指示。 由于Python中装饰器只能装饰类和方法&#xff0c;因此也只…

Mac 网络连接正常,微信可以使用,但浏览器打不开网页?

解决&#xff1a; Step1&#xff0c;选择&#x1f34e;图标&#xff0c;选择系统设置&#xff08;或系统偏好设置&#xff09;打开&#xff1b; Step2&#xff0c;选择网络&#xff0c;Wi-Fi Step3&#xff0c;选择详细信息&#xff1b; Step4: 选择代理&#xff0c;关闭右…

3.点位管理改造-列表查询——帝可得管理系统

目录 前言一、与页面原型差距1.现在&#xff1a;2.目标&#xff1a;3. 存在问题&#xff1a;所在区域和合作商ID展示的都是ID&#xff0c;而不是名称&#xff1b;同时合作商ID应改为合作商 二、修改1.重新设计SQL语句2.修改mapper层&#xff0c;使用Mybatis中的嵌套查询3.修改s…

C. Tree Pruning【Codeforces Round 975 (Div. 1)】

C. Tree Pruning (永远不知道为什么TLE直到把初始化的memset换成for循环 题意很简单&#xff0c;就是找到一个深度&#xff0c;使得删除最少的节点且所有的叶子节点都为这个深度。 从小到大遍历可能的深度i&#xff0c;容易知道所有 深度大于i的节点 和所有 子树最大深度小于i…

操作符详解与表达式求值

目录 操作符分类 1.算数操作符 2.移位操作符&#xff08;只适用于整数范围&#xff09; &#xff08;1&#xff09;引入 &#xff08;2&#xff09;左移操作符<< &#xff08;2&#xff09;右移操作符>> 3.位操作符 4.赋值操作符 复合赋值符 5.单目操作符 5…

深度优先搜索(DFS)与有向图中的唯一结点

深度优先搜索(DFS)与有向图中的唯一结点 前提与定义分析与方法伪代码与 C 代码实现解释结果在图论中,深度优先搜索(DFS)是一种用于遍历或搜索图的算法。DFS 从给定的起始结点出发,沿着图的深度方向尽可能深地搜索,直到无法继续为止,然后回溯并从未访问过的邻接结点继续…

Unraid的cache使用btrfs或zfs?

Unraid的cache使用btrfs或zfs&#xff1f; 背景&#xff1a;由于在unraid中添加了多个docker和虚拟机&#xff0c;因此会一直访问硬盘。然而&#xff0c;单个硬盘实在难以让人放心。在阵列盘中&#xff0c;可以通过添加校验盘进行数据保护&#xff0c;在cache中无法使用xfs格式…

YOLOv11改进 | Neck篇 | YOLOv11引入Slim-Neck(轻量)

1. Slim-Neck介绍 摘要&#xff1a;目标检测是计算机视觉中重要的下游任务。 对于车载边缘计算平台来说&#xff0c;巨大的模型很难达到实时检测的要求。 而且&#xff0c;由大量深度可分离卷积层构建的轻量级模型无法达到足够的精度。 我们引入了一种新的轻量级卷积技术 GSCon…

【顺序查找】

目录 一. 顺序查找的概念二. 查找的性能计算 \quad 一. 顺序查找的概念 \quad \quad 二. 查找的性能计算 \quad

使用ROCm的GPU感知MPI

GPU-aware MPI with ROCm — ROCm Blogs (amd.com) 注意: 此博客之前是 AMD Lab Notes博客系列的一部分。 MPI&#xff08;消息传递接口&#xff09;是高性能计算中进程间通信的事实标准。MPI进程在其本地数据上进行计算&#xff0c;同时进行大量的相互通信。这使得MPI程序可以…

【折半查找】

目录 一. 折半查找的概念二. 折半查找的过程三. 折半查找的代码实现四. 折半查找的性能分析 \quad 一. 折半查找的概念 \quad 必须有序 \quad 二. 折半查找的过程 \quad \quad 三. 折半查找的代码实现 \quad 背下来 \quad 四. 折半查找的性能分析 \quad 记住 比较的是层数 …

sed引入变量中的坑

sed引入变量问题 1、sed引入变量2、sed引入变量问题 1、sed引入变量 sed指令引入变量&#xff0c;直接使用双引号即可 例如&#xff0c;下面的示例&#xff1a; ab; echo "abc" | sed "s/b/$a/g"2、sed引入变量问题 但是&#xff0c;如果变量值中带有/等…

自闭症寄宿学校:释放孩子内心的美

在自闭症儿童的成长旅程中&#xff0c;寻找一个既能提供专业康复服务&#xff0c;又能让孩子感受到爱与关怀的教育环境&#xff0c;是许多家庭梦寐以求的目标。在广州&#xff0c;星贝育园自闭症儿童寄宿制学校正是这样一所充满爱与希望的学校&#xff0c;它不仅为自闭症儿童提…

CMU 10423 Generative AI:lec13/13.5(text-to-image models:三大类方法、评估标准、图像编辑原理)

1 文章目录 1 lec13和lec13.5概述2 Text-to-Image Generation 概念、主要方法、挑战、发展历程1. **基本概念**2. **主要技术方法**2.1. **生成对抗网络&#xff08;GAN&#xff09;**2.2. **自回归模型&#xff08;Autoregressive Models&#xff09;**2.3. **扩散模型&#x…

9.28学习笔记

1.ping 网址 2.ssh nscc/l20 3.crtl,打开vscode的setting 4.win 10修改ssh配置文件及其密钥权限为600 - 晴云孤魂 - 博客园 整体来看&#xff1a; 使用transformer作为其主干网络&#xff0c;代替了原先的UNet 在latent space进行训练&#xff0c;通过transformer处理潜…

Java项目实战II基于Java+Spring Boot+MySQL的智能物流管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 随着电商行业的蓬勃发展&#xff0c;物流行业迎来了前所未有的机遇与挑战。面对日益增长的订单量和复…

python如何显示数组

np.set_printoptions方法的相关属性&#xff1a; <span style"background-color:#272822"><span style"color:#f8f8d4">set_printoptions(precisionNone, thresholdNone, edgeitemsNone, linewidthNone, suppressNone, nanstrNone, infstrNo…

记一次RCE漏洞的利用

某微商代理商补货商城系统存在RCE漏洞 微商分销代理商城&#xff0c;可以自己设置代理等级和升级条件(如购买指定商品、消费额度)&#xff0c;“微商城小程序三级分销拼团秒杀多商户开店O2O门店”通过社交关系分销裂变&#xff0c;把粉丝变成客户&#xff0c;让分销商发展下线…