09 - Linux进程层次分析

news2024/11/6 11:44:43

---- 整理自狄泰软件唐佐林老师课程

查看所有文章链接:(更新中)Linux系统编程训练营 - 目录

文章目录

  • 1. 详解Linux进程组
    • 1.1 Linux进程组
    • 1.2 进程组示例程序
    • 1.3 编程实验:Linux进程组
    • 1.4 深入理解进程组
      • 1.4.1 进程组标识设置技巧
      • 1.4.2 编程实验一
      • 1.4.3 编程实验二
  • 2. 会话与终端的关系
    • 2.1 Linux会话(session)
    • 2.2 会话与终端
    • 2.3 登录实验
    • 2.4 会话与前后台进程组
      • 2.4.1 问题
      • 2.4.2 实验
  • 3. 会话编程深度剖析
    • 3.1 Linux会话接口
    • 3.2 实例

1. 详解Linux进程组

1.1 Linux进程组

  • 每个进程都有一个 进程组号(PGID
    • 进程组:一个或多个进程的集合(集合中的进程并不孤立)
    • 进程组中的进程通常存在 父子关系,兄弟关系,或功能相近
  • 进程组可方便进程管理(如:同时杀死多个进程,发送一个信号给多个进程)
    • 每个进程必定属于一个进程组,也只能属于一个进程组
    • 进程除了有PID外,还有PGID(唯一,但可变)
    • 每个进程组有一个 进程组长进程组长的PID和PGID相同
  • pid_t getpgrp(void); // 获取当前进程的组标识
  • pid_t getpgid(pid_t pid); // 获取指定进程的组标识
  • 对于int setpgid(pid_t pid, pid_t pgid); // 设置pid进程的进程组标识为pgid
    • 如果pid == pgid,将pid指定的进程设为组长
    • 如果pid == 0,设置当前进程的组标识为pgid
    • 如果pgid == 0,则将pid作为组标识

注释:

  • 函数作用:setpgid(pid, pgid) 将pid进程的进程组ID设置成pgid,创建一个新进程组或加入一个已存在的进程组
  • 函数性质:
    • 性质1:一个进程只能为 自己或子进程 设置进程组ID,不能设置其父进程的进程组ID。
    • 性质2:if(pid == pgid),由pid指定的进程变成进程组长;即进程pid的进程组标识pgid为pid。
    • 性质3:if(pid==0),将当前进程的pid作为进程组ID。
    • 性质4:if(pgid==0),将pid作为进程组ID。
  • 默认情况下,子进程与父进程 属于 同一个进程组

1.2 进程组示例程序

在这里插入图片描述

1.3 编程实验:Linux进程组

【参看链接】:09 - Linux进程层次分析 / 00进程组 / pgid_j.c

在这里插入图片描述在这里插入图片描述

1.4 深入理解进程组

  • 进程组长终止,进程组依然存在(进程组长仅用于创建新进程组),进程组中的 所有进程 结束之后,进程组消亡
  • 父进程创建子进程后立即通过 setpgid() 改变子进程的组标识(PGID),子进程从父进程的进程组移动到组标识的进程组;同时,子进程也需要通过 setpgid() 改变自身组标识(PGID)
  • 子进程 如果调用exec(),那么:
    • 父进程无法通过setpgid()改变子进程的组标识(PGID)
    • 子进程只能自身通过setpgid()改变组标识(PGID)

1.4.1 进程组标识设置技巧

在这里插入图片描述

1.4.2 编程实验一

【参看链接】:09 - Linux进程层次分析 / 01进程组标识设置技巧 / pgid_a.c

在这里插入图片描述在这里插入图片描述

1.4.3 编程实验二

【参看链接】:09 - Linux进程层次分析 / 02进程组中用execve

  1. 未加延时

在这里插入图片描述

在这里插入图片描述

  1. 加延时

在这里插入图片描述
注释:代码中的sleep(1),使得子进程先调用了evec(),父进程无法再通过setpgid()改变子进程的组标识(PGID)。

在这里插入图片描述

2. 会话与终端的关系

2.1 Linux会话(session)

  • 用户通过终端登陆系统后会产生一个 会话
  • 会话是 一个或多个 进程组 的集合
  • 每个会话有一个 会话标识(SID
    • 终端登录后的第一个进程成为 会话首进程,通常是一个 shell / bash
    • 对于会话首进程(session leader),其PID和SID相等,SID == PID
会话 SID
进程组 PGID进程组 PGID
...
进程 PID
进程 PID
...进程 PID
进程 PID
......

2.2 会话与终端

  • 通常情况下,会话 与一个 终端(控制终端) 相关联 用于执行输入输出操作
  • 会话首进程 建立与 控制终端 的连接(会话首进程又叫 控制终端
  • 会话中的进程组可分为:
    • 前台进程组:可接收控制终端中的输入,也可输出数据到控制终端
    • 后台进程组:所有进程后台运行,无法接受终端中的输入,但可输出数据到终端
  • 每个会话最多只有一个前台进程组,可以有多个后台进程组

在这里插入图片描述

2.3 登录实验

  1. 准备

在这里插入图片描述

注释:
  agetty 是一个在 Linux 系统上使用的程序,用于提供控制台终端的登录功能。它是 “getty”(“适配器调制解调器”的缩写)的一个变体,是一种用于处理终端登录的程序。
  agetty 的中文解释可以是 “虚拟终端登录程序” 或者 “控制台终端登录程序”。它通常用于在 Linux 系统上配置和管理虚拟终端(也称为控制台终端)的登录过程。
  agetty 在启动时会监视一个或多个虚拟终端设备,并等待用户输入用户名和密码。一旦用户成功登录,agetty 将为其提供一个交互式的命令行界面,以便用户可以执行各种命令和操作。
  agetty 提供了一些配置选项,可以控制登录界面的外观和行为,例如登录提示符、超时设置和登录失败处理等。这使得系统管理员能够根据特定的需求和安全策略来自定义登录过程。
  总之,agetty 是一个用于管理控制台终端登录的程序,在 Linux 系统上广泛使用。

  1. 此时,在虚拟机Ubuntu下同时按住 ctrl+alt+F6 进入6号终端,这时候先不进行登录:

在这里插入图片描述

  1. 同时按住 ctrl+alt+F2 回到shell图形界面:

在这里插入图片描述

  1. 切换到6号终端,只输入用户名,不登录:

在这里插入图片描述

  1. 切换回图形界面:

在这里插入图片描述

  1. 切换到6号终端,输入密码登录:

在这里插入图片描述

  1. 切换回图形界面:

在这里插入图片描述

2.4 会话与前后台进程组

在这里插入图片描述

2.4.1 问题

  • 问题1:
    • 在终端中输入命令后,会发生什么?
      • 当命令行shell 运行命令后创建一个新的进程组
      • 如果运行的命令中有 多个子命令 则创建 多个进程(处于新建的进程组中)
      • 命令 不带 &
        shell将新建的进程组设置为 前台进程组,并将自己暂时设置为后台进程组
      • 命令 带 &
        shell将新建的进程组设置为 后台进程组,自己依旧是前台进程组
  • 问题2:
    • 什么是 终端进程组标识(TPGID
      • 标识进程 是否 处于一个 和终端相关 的进程组中
      • 前台进程组:TPGID == PGID
      • 后台进程组:TPGID != PGID
      • 若进程和任何终端无关:TPGID == -1
  • 通过比较TPGID与PGID可判断:一个进程是属于前台进程组,还是后台进程组。
    由于前台进程组可能改变,TPGID用于标识当前的前台进程组

2.4.2 实验

【参看链接】:09 - Linux进程层次分析 / 03TPGID / pgid_j.c

在这里插入图片描述

  1. 不带 &

在这里插入图片描述

  1. 带 &

在这里插入图片描述

在这里插入图片描述

3. 会话编程深度剖析

3.1 Linux会话接口

#include <unistd.h>

  • pid_t getsid(pid_t pid); // 获取指定进程的 SID,(pid == 0)==> 当前进程
  • pid_t setsid(void); // 调用进程不能是进程组长
    • 创建新会话,SID == PID,调用进程成为会话首进程
    • 创建新进程组,PGID == PID,调用进程成为进程组长
    • 调用进程没有控制终端,若调用前关联了控制终端,调用后与控制终端断联

3.2 实例

  • 下面的程序输出什么?为什么?

在这里插入图片描述

【参看链接】:09 - Linux进程层次分析 / 04session / session.c

  1. 实验一

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 实验2

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【算法题解】35. 两两交换链表中的节点

这是一道 中等难度 的题 https://leetcode.cn/problems/swap-nodes-in-pairs/ 题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff…

LVS负载均衡群集及VS/NAT部署

一、企业群集应用概述 1.群集的含义 群集&#xff08;Cluster&#xff09;&#xff0c;又称集群。由多台主机构成&#xff0c;但对外只表现为一个整体&#xff0c;只提供一个访问入口&#xff08;域名或IP地址&#xff09;&#xff0c;相当于一台大型计算机。 但是在互联网应…

htmlCSS-----元素类型

目录 前言&#xff1a; 元素类型 1.块级元素 2. 行内元素 3. 行内块元素 前言&#xff1a; 今天我们就学习CSS中的元素的类型&#xff0c;了解网页元素类型的相关性质&#xff0c;有助于我们去对网页进行排版处理。下面就一起去看看吧。 元素类型 常见元素类型有&#xff…

又壕又实惠的 AI 训练来了,Hugging Face 第一的 LLM 大模型 Falcon 40B 纳入亚马逊云科技服务

出品 | CSDN 云计算 2023 年&#xff0c;几乎是 AI 爆炸式发展的一年。各类大模型接踵而至&#xff0c;全行业都将 AIGC 融入生产流程&#xff0c;以提升效率。最近&#xff0c;阿联酋首都阿布扎比的科研中心 TII&#xff08;Technology Innovation Institute&#xff09;拥有 …

制氧机语音芯片新方案,高品质低功耗NV040C语音IC

在医疗设备行业中&#xff0c;制氧机是一种常见的设备&#xff0c;尤其在之前疫情期间&#xff0c;制氧机甚至成为了医院中不可或缺的设备之一。而在制氧机中加入语音芯片的语音方案&#xff0c;则可以进一步提高其人机交互的体验&#xff0c;增强其功能和可靠性。在制氧机中&a…

超超超详细C++入门总结

C入门知识总结 1.什么是C2. C关键字(C98)3.命名空间3.1命名空间定义1.命名空间的普通定义2.命名空间的嵌套定义3.同一个工程中允许存在多个相同名称的命名空间&#xff0c;编译器最后会合成同一个命名空间 3.2命名空间的使用1.加命名空间名称以及作用域限定符2.使用using将命名…

Flume事务

Flume事务 在Flume中一共有两个事务 Put事务&#xff1a;在Source组件和Channel组件之间&#xff0c;保证Source组件到Channel组件之间数据传递的可靠性。 take事务&#xff1a;在Channel组件和Sink组件之间&#xff0c;保证channel组件到Sink组件之间数据传输的可靠性。Put事务…

算法拾遗三十二bfprt算法,蓄水池算法

算法拾遗三十二bfprt算法&#xff0c;蓄水池算法 在无序数组中求第k小的数快排解法bfprt解法 练习题目蓄水池算法bfprt 应用 在无序数组中求第k小的数 快排解法 // 改写快排&#xff0c;时间复杂度O(N)// k > 1public static int minKth2(int[] array, int k) {int[] arr …

HNU计算机图形学-作业一

任务一&#xff1a;创建交互式三维场景 前言 完整工程文件 具体运行环境配置看这个栏目的第一篇文章 专选课计算机图形学的第一次作业&#xff0c;老师是第一次给本科生上课&#xff0c;用的作业是香港中文大学的计算机图形学的作业内容&#xff08;老师就是这个学校毕业&a…

软件测试方法 -- 等价类边界值

测试用例的定义 测试用例是为了特定的目的而设计的一组测试输入、执行条件和预期的结果&#xff0c;以便测试是否满足某个特定需求。通过大量的测试用例来检验软件的运行效果&#xff0c;他是指导测试工作进行的依据。 下面我们介绍几种常用的黑盒测试方法 等价类划分法 定…

微信小程序实用工具——渐变色按钮(一)

今日推荐&#x1f481;‍♂️ 2023五月天演唱会&#x1f3a4;&#x1f3a4;&#x1f3a4;大家一起冲冲冲&#x1f3c3;‍♂️&#x1f3c3;‍♂️&#x1f3c3;‍♂️ 文章目录 今日推荐&#x1f481;‍♂️&#x1f3d6;️开头介绍 &#x1f468;‍&#x1f3eb;1️⃣ 按钮一…

【数学建模】 非线性规划+二次规划

非线性规划概念和实例 如果目标函数或约束条件中包含非线性函数&#xff0c;就称这种规划问题为非线性规划问题。一般说来&#xff0c;解非线性规划要比解线性规划问题困难得多。而且&#xff0c;也不象线性规划有单纯形法这一通用方法&#xff0c;非线性规划目前还没有适于各…

大咖驾到:XR云新未来|弹性算力赋能可交互、沉浸式商业实践

活动背景 XR市场作为数字化经济的重要发展方向&#xff0c;成为各大企业竞相布局的焦点。技术的进步和应用场景的扩大&#xff0c;为企业抢占XR市场先机、实现商业化带来了巨大机遇&#xff0c;同时也带来了技术挑战和成本压力。如何在竞争激烈的市场中脱颖而出&#xff0c;成…

【每日挠头算法题(3)】字符串解码|数组中重复的数字

每日挠头算法题 一、字符串解码思路&#xff1a;栈具体代码如下&#xff1a; 二、数组中重复的数字思路1&#xff1a;计数法具体代码如下&#xff1a; 思路2&#xff1a;原地交换法具体代码如下&#xff1a; 总结 一、字符串解码 点我直达~ 思路&#xff1a;栈 这道题怎么看都…

python 爬虫某东网商品信息 | 没想到销量最高的是

哈喽大家好&#xff0c;我是咸鱼 好久没更新 python 爬虫相关的文章了&#xff0c;今天我们使用 selenium 模块来简单写个爬虫程序——爬取某东网商品信息 网址链接&#xff1a;https://www.jd.com/ 完整源码在文章最后 元素定位 我们需要找到网页上元素的位置信息&#x…

Spring内容

(195条消息) 超高频面试题系列之----Spring全家桶&#xff08;面试亲测&#xff09;_spring全家桶面试题_zyyn_未来可期的博客-CSDN博客 1、推断构造方法&#xff1a; &#xff08;1&#xff09;如果只有一个构造方法&#xff0c;没问题就用这个 &#xff08;2&#xff09;如…

Java学习路线(26)——XML与设计模式

一、XML &#xff08;一&#xff09;XML的概念&#xff1a; XML是可扩展标记语言&#xff08;Extensible Markup Language&#xff09;&#xff0c;一种数据表示形式&#xff0c;可以描述非常复杂的数据结构&#xff0c;常用于传输和存储数据。 &#xff08;二&#xff09;XM…

day50|动态规划11-买卖股票的最佳实际3-4(限制买卖次数的情况)

123.买卖股票的最佳时机III 确定递归函数&#xff0c;当前的每一个状态都由前一天决定。 以dp[i][1]和dp[i][2]为例讲解递归函数的含义&#xff1a; dp[i][1]max(dp[i-1][1],dp[i-1][0]-prices[i]) 含义&#xff1a; 第i天的股票第一天持有状态有两种&#xff0c;一种是前一…

电脑msvcr100.dll丢失的解决方法(一键修复方法)

msvcr100.dll是Microsoft Visual C运行时库的组成部分之一&#xff0c;它是一个重要的动态链接库&#xff08;DLL&#xff09;文件&#xff0c;可在Windows操作系统上运行。它包含了许多C/C语言程序库函数的实现&#xff0c;常常被用于支持和调用不同软件程序的运算&#xff0c…

POSTGRES、MYSQL插入数据的UPDATE_INSERT实践

POSTGRES: 1、创建表 create table tbl_user( id serial PRIMARY KEY, name varchar(256), addr varchar(256), age int, score int, fav varchar(256) ); 2、创建唯一约束 alter table tbl_user add constraint name_add_age_unique unique(name,addr,age); 3、首先插入两条数…