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…

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

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

自相关函数与互相关函数

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…

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

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

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的方…

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

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

struts2面试问题_Struts2面试问答

struts2面试问题Struts2是用Java开发Web应用程序的著名框架之一。 最近&#xff0c;我写了很多Struts2教程 &#xff0c;在这篇文章中&#xff0c;我列出了一些重要的Struts2面试问题以及答案&#xff0c;以帮助您进行面试。 什么是Struts2&#xff1f; Struts1和Struts2之间…

什么是Mesh网络

网络间的通信原理 假设你的名字叫小不点&#xff0c;你住在一个大院子里&#xff0c;你的邻居有很多小伙伴&#xff0c;在门口传达室还有个看大门的李大爷&#xff0c;李大爷就是你的网关。当你想跟院子里的某个小伙伴玩&#xff0c;只要你在院子里大喊一声他的名字&#xff0…

根据谁创建资源授权资源

我的一位同事向我提出了一个关于StackOverflow的有趣问题&#xff0c;并由于我在Spring方面的经验&#xff0c;建议我回答一个很好的问题。 问题是&#xff1a;“ 如何基于使用注释在REST中创建资源的用户来授权特定资源 。” 要点是&#xff1a; 我想做的是创建一个名为Aut…

netbeans7.4_NetBeans 7.4的本机Java打包

netbeans7.4成为“ NetBeans 74 NewAndNoteworthy ”页面的NetBeans 7.4的新功能之一是“本机打包 ”&#xff0c;在该页面上被描述为“ JavaSE项目现在支持使用JavaFX提供的本机打包技术来创建本机包。 ” 我将使用一个非常简单的示例来演示NetBeans 7.4中的本机打包功能。 下…

斯坦纳点/树、泰森多边形

斯坦纳点 斯坦纳点别名正等角中心、费尔马点、斯坦纳点 在三角形的三边各向其外侧作等边三角形&#xff0c;这三个等边三角形的外接圆交于一点T&#xff0c;该点T即称为托里拆利点&#xff08;Torricelli’s point &#xff09;&#xff0c;而三个等边三角形的外接圆称为托里拆…

FXRibbon 1.2版发布

这次&#xff0c;有所不同。 Microsoft对FXRibbon的更新&#xff0c;就像Java的功能区控件&#xff08;JavaFX&#xff09;一样 。 在发出使FXRibbon做好更好的准备以将其更新到Java 9以及更高版本的要求之后&#xff0c;我借此机会还添加了一些功能&#xff0c;进行了一些美学…

c语言链表写贪吃蛇思路,C语言构建的链表贪吃蛇

用C语言链表写的贪吃蛇(程序设计时做的&#xff0c;做的不好大佬勿喷)借助游戏内容分析贪吃蛇所需的功能主要包括这几块&#xff1a;移动光标模块打印地图模块和基本规则信息读取最高分文件打印初始蛇模块打印时给予蛇的初始移动方向产生食物模块1)、保证食物在地图内产生2)、保…

用普罗米修斯和格拉法纳乐器来刺豪猪

Adam Bien的Porcupine库使配置用作应用程序隔板的专用执行程序服务变得容易。 我创建了一个扩展&#xff0c;通过MicroProfile Metrics公开了豪猪统计信息。 我们还可以通过Prometheus和Grafana仪表板使仪器可见。 进行此扩展的原因是我们希望对Porcupine线程池的检测进行简单…

三层网络架构

三层网络架构 数据中心网络是连接数据中心大规模服务器进行大型分布式计算的桥梁。 传统数据中心网络普遍采用树型拓扑方案&#xff0e; 典型的拓扑由三层交换机互联构成&#xff0c;分别是接入层交换机、汇聚层交换机和核心层交换机。Cisco称之为&#xff1a;分级的互连网络模…

SDN

直接理解 SDN是在2009年左右出现的一种新型网络结构&#xff0c;它将数据层面与控制层面分离&#xff0c;使用中央控制器完成网络的操作和管理&#xff0c;并通常采用OpenFlow协议作为其核心通信协议&#xff0c;拥有着集中式控制、可编程、部署灵活性和数据层面与控制层面相互…

IP地址分类(A类 B类 C类 D类 E类)

IP地址类型 公有地址 公有地址&#xff08;Public address&#xff09;由Inter NIC&#xff08;Internet Network Information Center因特网信息中心&#xff09;负责。这些IP地址分配给注册并向Inter NIC提出申请的组织机构。通过它直接访问因特网。 私有地址 私有地址&am…

android 开发 短信,Android开发之短信发送

今天要讲的是使用Android开发发送短信程序。我们先来看下运行效果图(1) 图(2)图(3)图(1)&#xff1a;当我们运行项目时&#xff0c;出现在屏幕的效果&#xff1b;图(2)&#xff1a;当我们输…

ISP (互联网服务提供商)

ISP&#xff1a;全称为Internet Service Provider&#xff0c;即因特网服务提供商&#xff0c;能提供拨号上网服务、网上浏览、下载文件、收发电子邮件等服务&#xff0c;是网络最终用户进入Internet的入口和桥梁。它包括Internet接入服务和Internet内容提供服务。这里主要是In…