linux 进程组id 错乱,【Linux】终端,进程组,作业,会话及作业控制

终端

概念

在UNIX系统中,用用户通过终端登录系统后得到一一个Shell进程,这个终端成为Shell进程的控制终端 (Controlling Terminal),控制终端是保存在PCB中的信息,而我们知道fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。

默认情况 下(没有重定向),每个进程的标准输入、标准输出和标准错误输出都指向控制终端,进程从标准输入读也就是读用户的键盘输入,进程往标准输出或标准错误输出写也就是输出到显示示器上。此外 在控制终端输入一些特殊的控制键可以给前台进程发信号,例如Ctrl-C表 示示SIGINT。

每个进程都可以通过一个特殊的设备文件/dev/tty访问它的控制终 端。事实上每个终端设备都对应一个不同的设备文件,/dev/tty提供了一一个通用的接口,一个进程要访问它的控制终端既可以通过/dev/tty也可以通过该终端设备所对应的设备文文件来访 问。

ttyname函数可以由文件描述符查出对应的文件名,该文件描述符必须指向一个终端设备而不能是任意文件。

下面我们来验证:

下面是验证代码:

468b06cc93298a4cfe2ea4fc29f42edc.png

得到的结果是:

0a6fe90f6cd55464d275609042c76edc.png

由结果我们可以看出

文件描述符:0(标准输入),1(标准输出),2(标准错误)的文件都在同一个终端下。

如果我们重新开一个终端,再次运行上面的代码,得到结果为:

f04720df826ea268bfa49785ac396053.png

进程组

概念

每一个进程除了有一个进程ID外,还属于一个进程组。

进程组是一个或多个进程的集合,通常情况下,他们是在同一作业中结合起来的,同一进程组的个进程接受来自同一终端的各种信号。

每一个进程组有一个唯一的进程ID。

进程组ID是一个正整数,可以使用getpgrp函数返回调用进程的进程组ID

#include

pid_t getpgrp(void);

组长进程

每个进程组都有一个组长进程,组长进程的进程组ID等于其进程ID。

进程组组长可以创建一个进程组,创建进程组中的进程然后种植。只要进程组中还有任意一个进程存在,那么这个进程组就存在。

从进程组的创建到最后一个进程离开的时间去成为进程组的生命周期。

进程组验证

首先我们编写验证进程组的代码:

efe7b7d9fe08ec8fb43ca17c54f2030e.png

在上面的代码中,我们首先创建两个进程,一个father父进程,一个child子进程,我们让father和child首先输出自己的pid,然后循环输出自己进程名称。

结果如下:

b9130f7b0f6cd7b350c3e7044d0bb5e4.png

由结果我们看出,父进程pid为3306,子进程pid为3307,然后父子进程循环打印father,child。

重新打开一个终端,输入命令

ps -axj | grep "proc_rela"

首先我介绍一下各个标识的意义。

PID(Process ID 进程 ID号)

Linux系统中总是会分配一个号码用于在其命名空间中唯一地标识它们,即进程ID号(PID),用fork或者cline产生的每个进程都由内核自动地分配一个新的唯一的PID值

TPGID(显示前台进程组)

TGID(Thread Group ID 线程组 ID号)

处于某个线程组(在一个进程中,通过标志CLONE_THREAD来调用clone建立的该进程的不同的执行上下文)中的所有进程都有统一的线程组ID(TGID)

如果进程没有使用线程,则它的PID和TGID相同

线程组中的”主线程”(Linux中线程也是进程)被称作”组长(group leader)”,通过clone创建的所有线程的task_struct的group_leader成员,都会指向组长的task_struct。

在Linux系统中,一个线程组中的所有线程使用和该线程组的领头线程(该组中的第一个轻量级进程)相同的PID,并被存放在tgid成员中。只有线程组的领头线程的pid成员才会被设置为与tgid相同的值。注意,getpid()系统调用

返回的是当前进程的tgid值而不是pid值。

我们可以这么理解

对于一个多线程的进程来说,它实际上是一个进程组,每个线程在调用getpid()时获取到的是自己的tgid值,而线程组领头的那个领头线程的pid和tgid是相同的

对于独立进程,即没有使用线程的进程来说,它只有唯一一个线程,领头线程,所以它调用getpid()获取到的值就是它的pid

PGID(Process Group ID 进程组 ID号)

每个进程都会属于一个进程组(process group),每个进程组中可以包含多个进程。进程组会有一个进程组领导进程 (process group leader),领导进程的PID成为进程组的ID (process group ID, PGID),以识别进程组.

PPID( Parent process ID 父进程 ID号)

PPID是当前进程的父进程的PID

SID(Session ID 会话ID)

STAT(状态栏)

D 不可中断 Uninterruptible sleep (usually IO)

R 正在运行,或在队列中的进程

S 处于休眠状态

T 停止或被追踪

Z 僵尸进程

W 进入内存交换(从内核2.6开始无效)

X 死掉的进程

< 高优先级

N 低优先级

L 有些页被锁进内存

s 包含子进程

+ 位于后台的进程组;

l 多线程,克隆线程 multi-threaded (using CLONE_THREAD, like NPTL pthreads do)

得到结果:

100176c7b12c01690c56129ac4e2c446.png

下面我们分析一下结果:

由程序输出结果我们已经得到,父进程的进程ID为3235,子进程的进程ID为3236。

于是我们看到第一个进程PID = 3235,为父进程,他的PGID为3235,就是他本身,即:

父进程就是进程组组长进程。

关于STAT位的意义在上面STAT有提到,所有标志相结合即可。

总结:

程序创建了一个进程,该进程又创建了子进程,于是父进程和子进程构成了一个进程组,进程组的组长为父进程。

那么如果父进程结束,子进程不结束,进程组存在不存在呢?

下面我们修改代码:

5a8e485ea0acef764e632cf65888c3f5.png

这次,我们让父进程创建子进程后就退出,当然父进程依然是组长进程,当父进程退出后,子进程依然在进行。

b6226e7338eee5979c62f5658bea65ef.png

0774d1ca5ce59162594bc93279e62d87.png

可以看到,子进程还在运行,并且组长进程ID就是父进程ID。

但是,即使子进程继续运行,我们还是可以在shell输入,并且ctrl+C键不能结束子进程,原因是什么呢?

这就是我下面要介绍的:

作业

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

作业与进程组的区别:

如果作业中的某个进程又创建了子子进程,则子子进程不属于作业。一旦作业运行行结束,Shell就把自己提到前台,如果原来的前台进程还存在(如果这个子进程还没终止),它自动变为后台进程组。

shell中运行的是作业,当父进程创建了子进程后,虽然子进程属于进程组,但是子进程不属于当前作业 ,所以当父进程退出的时候,当前作业也随之结束掉了。子进程就到后台进行。然后当前作业就变成bash,我们可以输入命令。因为此时子进程在后台,所以我们给他发送ctrl+C信号,他接收不到。所以无法停止,我是用kill命令结束子进程的。

会话

会话(Session)是一个或多个进程组的集合。

一个会话可以有一个控制终端。这通常是登陆到其上的终端设备(在终端登陆情况下)或伪终端设备(在网络登陆情况下)。建立与控制终端连接的会话首进程被称为控制进程。

一个会话中的几个进程组可被分为一个前台进程组以及一个或多个后台进程组。所以一个会话中,应该包括控制进程(会话首进程),一个前台进程组和任意后台进程组。

无论何时键入终端的终端键,都会将中断信号发送到前台进程组的所有进程

作业控制

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

ad9a9a98cd75c0ea89dc95e00a80ed25.png

如上图,我们输入两个命令,可以看出,输入第一个命令时:

ps,cat进程同属于一个进程组,组长为ps,bash,ps,cat三个进程属于一个会话,Learder是bash。

当输入第二个命令时,在命令后在&符号,表示该进程在后台运行,[1]是作业编号,4439是该作业中某一个进程的ID,很明显,在上例中,4439是cat进程。

作业控制与三个信号

SIGINT(Ctrl + C)——中断字符

SIGQUIT(Ctrl +\)——退出字符

SIGTSTP(Ctrl + Z)——挂起字符

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

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

相关文章

纳什均衡

纳什均衡&#xff08;或者纳什平衡&#xff09;&#xff0c;Nash equilibrium ,又称为非合作博弈均衡&#xff0c;是博弈论的一个重要策略组合&#xff0c;以约翰纳什命名。 定义 经济学定义 数学定义 纳什均衡的定义&#xff1a;在博弈G﹛S1,…,Sn&#xff1a;u1,…&#x…

linux 添加本地源,linux 添加本地yum源

1、yum repolist2、https://opsx.alibaba.com/mirror&#xff0c;首先下在该镜像站点中的yum&#xff0c;这里选择epel源epel-release-latest-7.noarch.rpm3、rpm -ivh epel-release-latest-7.noarch.rpm # 安装源4、此时看到epel源已经安装好了&#xff0c;如果我们不适用bas…

稳定婚姻问题:Gale–Shapley算法

&#xff08;一&#xff09;问题的引出 在组合数学、经济学、计算机科学中&#xff0c;稳定婚姻问题&#xff08;英语&#xff1a;stable marriage problem&#xff0c;简称SMP&#xff09;又称为稳定配对问题&#xff08;stable matching problem&#xff09;&#xff0c;是指…

Linux程序设计实验项目六,《linux程序设计》实验教学大纲

《linux程序设计》实验教学大纲课程名称&#xff1a;Linux程序设计课程编号&#xff1a;408412420408436407适用专业&#xff1a;计算机科学与技术网络工程软件工程总 学 分&#xff1a;3总 学 时&#xff1a;48其中实验学时16一、实验课程性质、目的与任务《Linux程序设计》课…

宣布EAXY:使Java中的XML更容易

Java中的XML库是一个雷区。 操作和读取XML所需的代码量令人震惊&#xff0c;使用不同的库遇到类路径问题的风险很大&#xff0c;并且对名称空间的处理带来许多混乱和错误。 最糟糕的是&#xff0c;情况似乎并没有改善。 一位同事让我意识到JOOX库。 这是解决这些问题的一个很好…

奇异值分解(SVD)原理与在降维中的应用

奇异值分解 奇异值分解(Singular Value Decomposition&#xff0c;以下简称SVD)是在机器学习领域广泛应用的算法&#xff0c;它不光可以用于降维算法中的特征分解&#xff0c;还可以用于推荐系统&#xff0c;以及自然语言处理等领域。是很多机器学习算法的基石。本文就对SVD的…

嵌套类和私有方法

当您在另一个类中有一个类时&#xff0c;他们可以看到彼此的private方法。 在Java开发人员中并不为人所知。 面试中的许多候选人说&#xff0c; private是一种可见性&#xff0c;它使代码可以查看成员是否属于同一班级。 这实际上是对的&#xff0c;但是更准确地说&#xff0c;…

linux 信号没有被处理方法,[计算机]Linux 信号signal处理机制.doc

[计算机]Linux 信号signal处理机制Linux 信号signal处理机制信号是Linux编程中非常重要的部分&#xff0c;本文将详细介绍信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号&#xff0c;以及有关信号的几个系统调用。 信号机制是进程之间相互传递消息的一种方法…

自相关函数与互相关函数

1 概念 1 自相关函数 2 互相关函数 从定义式中可以看到&#xff0c;互相关函数和卷积运算类似&#xff0c;也是两个序列滑动相乘&#xff0c;但是区别在于&#xff1a;互相关的两个序列都不翻转&#xff0c;直接滑动相乘&#xff0c;求和&#xff1b;卷积的其中一个序列需要先…

Linux as4开启telnet,linux as4 虚拟机 上开启 telnet 和ssh 和 ftp 服务

1.telnet服务开启(1)输入[rootrehat ~]# chkconfig krb5-telnet --listkrb5-telnet on这是你的服务存在的状态&#xff0c;如果没有的话&#xff0c;可能是你的telnet名字和我的不一样&#xff0c;也可能是你的那个rpm包没有安装。我第一次的Linux中是没有安装的&#xff0…

解决MATLAB不能设置为.m文件默认打开方式

转载&#xff1a;https://blog.csdn.net/yujiaerzong/article/details/77624167 将下面代码复制保存为 associateFiles.m 文件。 或者从下面链接下载文件https://ww2.mathworks.cn/matlabcentral/fileexchange/51165-matlab-file-association-fix 在MATLAB中运行 associateFil…

linux 我的世界 跨平台联机,我的世界跨平台联机 PC、手机等平台数据互通

我的世界 ( MineCraft&#xff0c;简称 MC ) 》是一款开放世界沙盒建造游戏&#xff0c;有着超高的自由度&#xff0c;在国内外有着相当高的人气&#xff0c;各年龄层的玩家都非常的喜欢玩。在这次 E3 2017 微软展前发布会上&#xff0c;微软除了公布新主机 Xbox One X ( 原名 …

展望Java的未来:空值类型

尽管有前途的Java值类型不是迫在眉睫&#xff0c;但我偶尔还是喜欢在OpenJDK valhalla-dev邮件列表中打听一下&#xff0c;以了解事情的进展情况并了解即将发生的事情。 诚然&#xff0c;由于我对所用术语的了解有限&#xff0c;并且其中某些消息的底层细节&#xff0c;使我无法…

5G的场景、需求、通信速率

5G三大典型场景 5G有三大典型场景&#xff0c;这三大场景描述了5G的需求也反应了5G与4G的不同&#xff0c;如图所示&#xff0c;三大场景分别为&#xff1a;增强型移动宽带通信&#xff08;eMBB&#xff09;&#xff0c;大规模机器型通信&#xff08;eMTC&#xff09;和超高可…

fceux模拟器linux,超强FC模拟器fceux-2.2.3最新版

超强FC模拟器fceux-2.2.3最新版fceux一款超好用的FC模拟器软件&#xff0c;这个是最新版本的fceux-2.2.3-win32.zip较之早前版本&#xff0c;2.2.2 版本修正部分 bug 并添加了新功能&#xff0c;主要是调试和逆向编译工程的功能。较之早前版本&#xff0c;2.2.1 版本修正大量 b…

linux7禁用ipv6,RHEL 7 及 CentOS 7 彻底禁用IPv6的方法

原标题&#xff1a;RHEL 7 及 CentOS 7 彻底禁用IPv6的方法IPv6在未来可能成为主流&#xff0c;但是就目前而言&#xff0c;很多软件对IPv6的支持并不是很完善&#xff0c;可能导致各类问题。RHEL 7 & CentOS 7 在启动时默认是加载IPv6相关模块的&#xff0c;而禁用IPV6的方…

jpa 分页 排序 过滤_使用JPA标准@ViewScoped通过分页,过滤和排序进行Primefaces DataTable延迟加载...

jpa 分页 排序 过滤Primefaces数据表惰性分页有效&#xff0c;但是在Web上使用Criteria搜索完整示例后&#xff0c;我感到非常沮丧。 所以我混合了来自 http://stackoverflow.com/questions/13972193/how-to-query-data-for-primefaces-datatable-with-lazy-loading-and-pagin…

通信中的backhaul

backhaul 可以翻译成回程,也叫回程线路在现有的无线通信中,backhaul指的是基站和基站控制器之间的链接(一般用户先接入基站,基站再与基站控制器通信,然后进入核心网)。在无线技术中&#xff0c;回程&#xff08;backhaul&#xff09;指的是从信元站点向交换机传送语音和数据流量…

西班牙语言,字母c的发音规则,西语初学者必看:西语29个字母解读

其实西班牙语并没有英语那么复杂的发音规则&#xff0c;除了r这个字母比较难发&#xff0c;其他几乎每一个字母都只有一个特定的音。所以对于西班牙语初学者而言&#xff0c;不用太担心&#xff0c;因为难就退却了。为了更好地帮助初学者进入学习状态&#xff0c;就西班牙语的2…

宏基站、分布式基站、小基站

基站即公用移动通信基站&#xff0c;是无线电台站的一种形式&#xff0c;是指在一定的无线电覆盖区中&#xff0c;通过移动通信交换中心&#xff0c;与移动电话终端之间进行信息传递的无线电收发信电台。 目前&#xff0c;在 5G时代 &#xff0c;“ 宏基站 为主&#xff0c; 小…