会话、进程组与僵死进程

浅析Linux守护进程、守护进程的创建步骤 何为守护进程 、进程组 / 组长进程 / 会话 / 会话首进程 、守护进程的创建步骤 、创建守护进程程序示例 阅读详情
 
1.   终端

      在Linux系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),Shell进程启动的其他进程的控制终端也是这个终端。默认情况下(没有重定向),每个进程的标准输入、标准输出和标准错误输出都指向控制终端,进程从标准输入读也就是读用户的键盘输入,进程往标准输出或标准错误输出写也就是输出到显示器上。此外在控制终端输入一些特殊的控制键可以给前台进程发信号,例如Ctrl+C表示SIGINT,Ctrl+\表示SIGQUIT。

2.   会话与进程组

     每次用户登录终端时会产生一个会话(session)。从用户登录开始到用户退出为止,这段时间内在该终端执行的进程都属于这一个会话。

      每个进程除了有一进程ID之外,还属于一个进程组(Process Group)。进程组是一个或多个进程的集合,每个进程组有一个唯一的进程组ID。多个进程属于进程组的情况是多个进程用管道“|”号连接进行执行。如果在命令行执行单个进程时这个进程组只有这一个进程。

3.   控制终端

      在终端(包括telnet等伪终端)登录就会产生一个会话,此会话拥有这一个单独的控制终端。

      建立与控制终端连接的会话首进程,被称之为控制进程,也就是Shell进程。

一个会话中的几个进程组可被分成一个前台进程组以及一个或几个后台进程组。

4.   作业控制

      前后台运行的进程组又称为作业(Job),一个前台作业可以由多个进程组成,一个后台作业也可以由多个进程组成,Shell进程可以同时运行一个前台作业和任意多个后台作业,这称为作业控制(Job Control)。

      作业控制允许在一个终端上起动多个作业(进程组),控制哪一个作业可以存取该终端,以及哪些作业在后台运行。

      从Shell进程使用作业控制功能角度观察,可以在前台启动一个作业或后台启动多个作业。一个作业只是几个进程的集合,通常用管道连接各进程。

      例如下面的命令在后台(&表示在后台运行)启动了两个作业,这两个后台作业所调用的进程都在后台运行。

cat   *.c   | pg   &

make   all   &

     实际上有三个特殊字符可使终端驱动程序产生信号,信号将送至前台进程组的所有进程,而后台进程组作业则不受影响,它们是:

①    中断字符(DELETE或Ctrl-C)产生SIGINT信号。

②    退出字符(Ctrl-\)产生SIGQUIT信号。

③    挂起字符(Ctrl-Z)产生SIGTSTP信号。

5.   会话与进程组的关系

    例如用以下命令启动5个进程。

$ proc1 | proc2 &

$ proc3 | proc4 | proc5

     其中proc1和proc2属于同一个后台进程组,proc3、proc4、proc5属于同一个前台进程组,Shell进程本身属于一个单独的进程组。这些进程组的控制终端相同,它们属于同一个session。其进程、进程组、session的关系如下图12-12所示。

                                   图12-12 会话与进程组关系图

       现在从session和进程组的角度重新来看登录和执行命令的过程。在上面的例子中,proc3、proc4、proc5被Shell放到同一个前台进程组,其中proc3进程是该进程组的组长,Shell进程调用wait等待它们运行结束,一旦它们全部运行结束,Shell进程就调用tcsetpgrp函数将自己提到前台继续接收命令。但是注意,如果proc3、proc4、proc5中的某个进程又fork出子进程,子进程也属于同一进程组,但是Shell进程并不知道子进程的存在,也不会调用wait等待它结束。换句话说,proc3 | proc4 | proc5是Shell进程的作业,而这个子进程不是,这是作业和进程组在概念上的区别。一旦作业运行结束,Shell进程就把自己提到前台。

6.   进程组和会话实例说明

(1)进程组与会话实例一

$ ps -o pid,ppid,pgrp,session,tpgid,comm | cat

  PID  PPID  PGRP  SESS TPGID COMMAND

 6994  6989  6994  6994  8762 bash

 8762  6994  8762  6994  8762 ps

 8763  6994  8762  6994  8762 cat

这个作业由ps和cat两个进程组成,在前台运行。从PPID列可以看出这两个进程的父进程是bash;从PGRP列可以看出,bash在进程组ID为6994的进程组中,这个进程组ID等于bash的进程ID,所以它是进程组的组长;而两个子进程在8762的进程组中,ps是这个进程组的组长;从SESS列可以看出这三个进程都在同一session中,会话ID为6994,bash是会话首进程;从TPGID列可以看出,前台进程组ID是8762,也就是ps和cat这两个进程所在的进程组,其中ps进程为进程组的组长。

 

(2)进程组与会话实例二

$ ps -o pid,ppid,pgrp,session,tpgid,comm | cat &

[1] 8835

$   PID  PPID  PGRP  SESS TPGID COMMAND

 6994  6989  6994  6994  6994 bash

 8834  6994  8834  6994  6994 ps

 8835  6994  8834  6994  6994 cat

这个作业由ps和cat两个进程组成,在后台运行。bash不等作业结束就打印提示信息“[1] 8835”,然后给出提示符接受新的命令,“1”是作业的编号,如果同时运行多个作业可以用这个编号区分,“8835”是该作业中某个进程的进程ID。

7.   进程组函数

(1)进程组函数说明

每个进程组有一个组长进程,组长进程ID等于其进程组ID。只要在某个进程组中有一个进程存在,则该进程组就存在,这与其组长进程是否终止无关。从进程组创建开始到其中最后一个进程离开为止的时间区间称为进程组的生命期。

 

(2)取进程组ID函数原型

 getpgrp(取得进程组识别码)

 

所需头文件

#include <unistd.h>

函数说明

getpgrp()用来取得目前进程所属的组识别码。此函数相当于调用getpgid(0)

函数原型

pid_t getpgrp(void)

函数返回值

返回目前进程所属的组识别码

(3)设置进程组ID函数原型

 setpgrp(设置进程组识别码)

所需头文件

#include <unistd.h>

函数说明

setpgid()将参数pid 指定进程所属的组识别码设为参数pgid 指定的组识别码。如果参数pid 为0,则会用来设置目前进程的组识别码,如果参数pgid为0,则会以目前进程的进程识别码来取代

函数原型

int setpgid(pid_t pid,pid_t pgid)

函数返回值

执行成功则返回组识别码,如果有错误则返回-1,错误原因存于errno中

错误代码

EINVAL:参数pgid小于0

EPERM:进程权限不足,无法完成调用

ESRCH:找不到符合参数pid指定的进程

进程调用setpgid(pid, pgid)可以参加一个现存的组或者创建一个新进程组,这时pid进程的进程组ID设置为pgid。如果这两个参数相等,则pid指定的进程变成进程组组长。

一个进程只能为它自己或它的子进程设置进程组ID。在它的子进程调用了 exec后,它就不再能改变该子进程的进程组ID。如果设置的pid等于0,则使用调用者的进程ID;如果设置pgid等于0,则使用pid进程的进程组ID。

在大多数作业控制中,在fork之后调用此函数,使父进程设置其子进程的进程组ID,然后使子进程设置其自己的进程组ID。这些调用中有一个是冗余的,但这样做可以保证父、子进程在进一步操作之前,子进程都进入了该进程组。如果不这样做的话,那么就产生一个竞态条件,因为它依赖于哪一个进程先执行。

在发送一个信号时,信号可以发送给一个进程或送给一个进程组。

8.   会话函数

(1)会话函数原型

       setsid(创建一个新的会话)

所需头文件

#include <sys/types.h>

#include <unistd.h>

函数说明

创建一个新的会话

函数原型

pid_t setsid(void)

函数返回值

若成功则为进程组 ID,若出错则为-1

 

(2)会话说明

用户每次用户登录会产生一个会话。如果调用setsid此函数的进程不是一个进程组的组长,则此函数会创建一个新会话,所产生的结果如下:

此进程变成该新会话的会话首进程(会话首进程是创建该会话的进程),此进程是该新会话中的唯一进程。

此进程成为一个新进程组的组长进程,新进程组ID是此进程的进程ID。

此进程没有控制终端,如果在调用setsid之前,此进程有一个控制终端,那么这种联系也被解除。

如果此调用进程已经是一个进程组的组长,则此函数返回出错。为了保证不处于这种情况,通常先调用fork,然后使其父进程终止,而子进程则继续。因为子进程继承了父进程的进程组ID,而其进程ID则是新分配的,两者不可能相等,所以这就保证了子进程不是一个进程组的组长。

 

(3)setsid函数的作用如下

①    让进程摆脱原会话的控制。

②    让进程摆脱原进程组的控制。

③    让进程摆脱原控制终端的控制。

9.   孤儿进程

一个父进程已终止的进程称为孤儿进程 (orphan process),这种进程由1号进程init收养。

10.   僵尸进程

(1)僵尸进程的产生

一个进程在调用exit函数结束自己生命的时候,其实它并没有真正的被完全销毁,而是留下一个称为僵尸进程(Zombie)的数据结构。
  在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经释放了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个表项,记载该进程的退出状态等信息供其他进程收集。除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果它的父进程没有设置SIGCHLD信号处理函数、或者没有设置SIGCHLD信号为忽略(SIG_IGN)、或者没有调用wait(或waitpid)等待子进程结束,那么它就一直保持僵尸状态。如果这时父进程结束了,那么init进程会自动接手这个子进程,僵尸进程消失。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。

 

(2)怎样来清除僵尸进程

    清除僵尸进程有三种处理方法,具体说明如下:

改写父进程,在子进程死后为它收尸。具体做法是接管SIGCHLD信号,子进程死后,会发送SIGCHLD信号给父进程,父进程调用wait(或waitpid)函数为子进程收尸。

在父进程中设置SIGCHLD信号处理函数或者设置SIGCHLD信号为忽略(SIG_IGN)。

把父进程杀掉,父进程死后,僵尸进程成为“孤儿进程”,过继给1号进程init,init始终会负责清理僵尸进程,它产生的所有僵尸进程也跟着消失。

            摘录自《深入浅出Linux工具与编程》
wsl2上运行带有Isaac Gym的程序报错: GPU Pipeline: disabled 显示GPU Pipeline:disabled,查找相关文档发现是WSL2目前不支持Isaac Gym,时,想要在wsl2上运行,最后报错如下。 阅读详情

相关推荐

C#实现不占用串口的串口监听与侦听技术:高效监控串口数据的最佳实践

本文详细介绍了如何实现不占用串口的串口监听与侦听技术,解决了传统串口监听可能带来的串口占用问题。通过使用虚拟串口、外部监听工具或第三方库,我们可以高效地实现串口数据的捕获与处理,适用于各种工业控制、物联网和嵌入式开发的应用场景。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1675

【进程概念】进程状态以及僵尸进程(结合代码)

而在task_struct里,其实也就是用一些变量来表示进程状态,其中state表示的就是进程的当前状态,state定义在 Linux 源文件 include/linux/sched.h 头文件中.-1 就表示不能运行,0表示运行,大于0表示停止。(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。而僵尸进程已经终止了,内核还在保留着他的退出信息知道父进程回收为止,与僵尸类似。表示一个进程死亡,CPU会进行资源的回收。

稻草人敲代码的博客 1516

检索增强世界模型(R-WoM)原理与应用实践

世界模型是AI系统理解环境的核心技术,通过构建环境的内部表示实现状态预测和行动规划。传统方法基于RNN或VAE等神经网络,而检索增强世界模型(R-WoM)创新性地引入检索机制,结合外部记忆库提升系统性能。这种架构突破模型参数限制,使AI能像人类一样利用历史经验解决问题,在游戏AI、虚拟助手等场景表现优异。关键技术包括FAISS相似性搜索、分层记忆管理和动态检索策略,其中Transformer编码器和GRU动态模型的组合实现高效环境建模。实践表明,该方法可提升47%的战术多样性,加快32%的应急响应速度。

weixin_42676876的博客 341

【Linux】进程状态(阻塞、挂起、僵尸进程)

文章讲解了Linux中进程状态的相关知识,以示例具体展示了进程了睡眠状态、运行状态、暂停状态及僵尸状态等。

大米饭的记录册 4931

医学影像弹性形变处理

这段代码的主要流程是:读取 DICOM 医学影像,尝试使用 MONAI 进行弹性形变(根据版本适配),如果失败则使用 OpenCV 实现,最后可视化并保存处理结果。这样可以在不同环境下灵活处理医学影像的弹性形变需求。后面会写一篇解释弹性变形方法的短文。

wh_xia_jun的专栏 779

MSDN Win10镜像缺少驱动?这里有全面解决方案

针对MSDN Win10镜像缺少驱动的问题,本文提供了四种解决方案:厂商官网下载驱动程序、利用Windows更新获取驱动、使用第三方驱动更新工具以及使用集成驱动的Win10系统镜像。每种方案都有其优缺点,用户可以根据自己的需求和实际情况选择合适的方案。建议优先考虑官方渠道:官方渠道下载的驱动程序稳定可靠,是解决问题的首选方案。谨慎选择第三方工具:使用第三方工具时,务必选择信誉好、无广告捆绑的工具,并注意保护个人隐私和计算机安全。备份重要数据:在进行系统安装或更新前,务必备份重要数据以防丢失。

nntxthml的博客 1524

会话,进程组,守护进程的特点,守护进程的步骤

文章目录守护进程步骤 守护进程特点:运行周期长(开机直至你关机或者系统关闭),在后台运行,不用和用户交互(脱离终端) 会话:每打开一个终端就建立了一个会话 会话首进程:该会话运行的第一个进程(bash)(用该bash的PID来标识该会话(id)) 进程组:每运行一个命令,就是一个进程组(进程组的id是该命令的PID或父进程的PID(父子进程)) 组长进程:父子进程中父进程为组长进程 getsid(0):会话id getpgrp():进程组id setsid():创建一个新会话(从别的会话中拿出的子进程).此

weixin_45510561的博客 1515

解析AI人工智能领域AI芯片的散热技术

当你用ChatGPT写代码、用AI生成高清图片时,背后的AI芯片可能正在“发高烧”——全球TOP500超算的平均功耗已突破10兆瓦,单颗GPU的峰值功耗超过700W(相当于3台家用空调同时运行)。本文将聚焦AI芯片的散热技术,覆盖从基础原理到前沿方案的全链条解析,帮助读者理解“散热为什么比算力更重要”。

AIGC应用创新大全的博客 936

进程组、进程、会话的理解2

这篇看懂了。。。第一种情况:[root@qht2 ~]# ps -ef | grep httpd root 3799 1 0 10:41 pts/0 00:00:00 /usr/sbin/nss_pcache off /etc/httpd/alias root 3803 1 3 10:41 ? 00:00:00 /usr/sbin/httpdapache 3807 3803 0 10:41 ?...

henweimei的博客 1689

用Python爬虫抓取大宗交易成交数据:全面解析与实战代码

大宗交易是指在证券市场中,涉及大额买卖的交易。此类交易通常由机构投资者进行,其交易量较大,对市场的影响显著。大宗交易数据包含了买卖双方的成交价格、成交量等关键信息,这些数据对于投资者和分析师而言,具有重要的市场预测意义。Python爬虫是一种自动化抓取互联网上数据的工具。通过爬虫,我们可以定期获取大宗交易数据,节省人工查询的时间。爬虫的工作原理通常包括:发送HTTP请求、获取响应数据、解析网页内容、提取关键信息、存储和展示数据。

2201_76125261的博客 417

基于YOLOv8的表面裂痕等缺陷检测:深度学习与UI界面的实践

本文详细介绍了如何使用YOLOv8进行表面裂痕等缺陷检测,并结合图形用户界面展示检测结果。通过YOLOv8的强大能力,我们可以实现高效、准确的表面缺陷检测,提升工业产品的质量控制水平。未来,随着深度学习技术和数据集的不断发展,表面缺陷检测的精度和速度将不断提升,应用领域也将进一步拓展。希望本文的实践能够为深度学习在工业检测领域的应用提供一些启示。

YOLO 550

linux的会话、进程、进程组等概念

1.一些缩写 PID = 进程ID (由内核根据延迟重用算法生成) PPID = 父进程ID(只能由内核修改) PGID = 进程组ID(子进程、父进程都能修改) SID = 会话ID(进程自身可以修改,但有限制,详见下文) TPGID= 控制终端进程组ID(由控制终端修改,用于指示当前前台进程组) 2.关于进程、进程组、会话之前的关系 总体关系: 进程属于一个进程组,进程组属

better me的博客 4353

【碳排放数据集】全球近实时网格化二氧化碳排放数据集GRACED

【碳排放数据集】全球近实时网格化二氧化碳排放数据集GRACED

WW、forever的博客 146

《unix高级环境编程》进程关系——控制终端、作业控制和守护进程

僵尸进程与孤儿进程 僵尸进程:先于父进程终止,但是父进程没有对其进行善后处理(获取终止子进程有关信息,释放它仍占有的资源)。消灭僵尸进程的唯一方法是终止其父进程。 孤儿进程:该进程的父进程先于自身终止。其特点是PPID=1(init进程的ID)。一个孤儿进程可以自成孤儿进程组。 文中用到的缩写 PID = 进程ID (由内核根据延迟重用算法生成) PPID = 父进程ID(只能由内核修改

关注校招求职,微信号:job_campus 2221

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

进程关系

ps -efj  (-j 显示与作业有关的信息) UID         PID         PPID         PGID        SID         TTY        COMD 用户ID    进程ID     父进程ID     进程组ID    会话ID    终端名称    命令字符串 其中父进程为0的属于内核进程 进程组:每个进程组都有一个组长进程,组长进...

对酒当歌 243

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

第九章 进程关系

第九章、    进程关系 如果用户正确登录, login程序就完成以下工作:          将当前工作目录更改为用户的起始目录(chdir)     调用 chown 更改获得终端的所有权,使登录用户成为它的所有者     将对该终端的设备的访问权限改变成 “用户读和写”     调用 setgid 和 initgroups 设置进程的组ID

博客 692

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

linux 进程操作相关的函数讲解

获取进程的相关标识符信息函数 fork函数 可以考虑几个问题: 子进程是否copy了父进程的所有内存等信息,没有的话是如何实现的 子进程和父进程的文件操作是怎么实现同步的,父子进程会文件共享,包括偏移量。如果不关闭文件操作符会发生什么 子进程和父进程有哪些是一样的,哪些是不一样的,考虑一下,利于理解 vfork函数,该函数和fork函数一样都会产生新的子进程,那么提出该函数的意义在哪,提高效率,vfork是为专门的场景服务的。vfork保证了子进程先运行。子进程在父进程的地址空间中运行 ..

weixin_42599871的博客 871

linux进程总结笔记

进程进程组会话 守护进程的创建 孤儿进程 僵死进程 进程优先级1. 进程、进程组、会话进程(process)属于进程组(group),进程组属于会话(session)2. 守护进程的创建 父进程 fork() 产生子进程,父进程退出.这样做保证即将要成为会话组长的进程,调用setsid()能调用成功 父进程先于子进程退出后,子进程,被init进程收养,调用setsid(),脱离init进程控制,成为

Luo_YuPing 669

Linux进阶-进程

子进程表项的内容来自于父进程,fork系统调用会将父进程的进程表项复制为副本,并分配给子进程。Linux内核会为子进程分配CPU时钟周期,在合适的时间将子进程调度上CPU运行,这时子进程处于内核态,子进程开始运行。被分配的CPU时钟周期结束时,Linux内核再次调度子进程,将子进程调出CPU,子进程进入用户态。最初,父进程通过fork系统调用创建子进程,子进程被创建后,处于创建态。进程执行exit系统调用后,Linux内核将删除进程的上下文,但保留进程表项,进程处于僵死态。两个进程之间并无父子关系。

weixin_47077788的博客 1137

APUE读书笔记--进程基础

第8章 进程控制*进程标识每个进程由一个正整数唯一标识,若该进程终止,它的进程标识整数可以被其他进程使用。L/Unix系统中 0进程表示swapper进程,它不执行磁盘上的代码,所以被称为系统进程。进程1,也就是init进程负责在自举后启动一个UNIX系统,通常配合/etc/rc*等文件启动系统。  *关于fork    .fork是创建一个新进程的唯一方式,它调用一次,返回两次。然后两者

zg_hover的专栏 1165

linux学习笔记之进程

一、基础知识 1:进程。   1,进程ID: 非负整数,具有唯一性。     1)ID=0的进程:调度进程/交换进程。内核的一部分。不执行任何磁盘上的程序。     2)ID=1的进程:init进程。       1-自举结束时,由内核调用,且不会终止。       2-用于读取与系统有关的初始化文件。并引导系统至一个状态。       3-使用root权限运行,是所有孤儿进程的父进...

weixin_30576859的博客 63

linux0.12-8-8-eixt.c

学习记录,打卡。卷起来!(-:

fitpolo 576

守护进程

守护进程的概念: 长时间在后台执行,不与用户交互,但是能提供某种服务的进程。 一般守护进程的命名以 "d"来结尾,说明这是个守护进程,例如 : httpd 要实现守护进程,首先需要了解下面4个概念: 1. 会话: 可以认为在Linux中每打开一个终端就与系统建立一个会话 2. 会话首进程: 在会话建立的第一个进程,一般来说是终端中的...

MaiDang_的博客 4216
上一篇: system函数
下一篇: 守护进程(Daemon)的编写
guoping16
博客等级 码龄19年 283粉丝 47原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值