Linux 进程层次分析

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 指定的进程设为组长
  • pid == 0,设置当前进程的组标识
  • pgid == 0,则将 pid 作为组标识

进程组示例程序

深入理解进程组

进程组长终止,进程组依然存在 (进程组长仅用于创建新进程组)

父进程创建子进程后立即通过 setpgid() 改变其组标识 (PGID)

同时,子进程也需要通过 setpgid() 改变自身组标识 (PGID)

子进程调用 exec()

  • 父进程无法通过 setpgid() 改变其组标识 (PGID)
  • 只能自身通过 setpgid() 改变其组标识 (PGID)

进程组标识设置技巧

进程组实验

Linux 会话 (session)

用户通过终端登录系统后会产生一个会话

会话是一个或多个进程组的集合

每个会话有一个会话标识 (SID)

  • 终端登录后的第一个进程成为会话首进程,通常是一个 shell/bash
  • 对于会话首进程 (session leader),其 PID 与 SID 相等

通常情况下,会话与一个终端 (控制终端) 相关联用于执行输入输出操作

  • 会话首进程建立与控制终端的连接 (会话首进程又叫控制进程)
  • 会话中的进程可分为
    • 前台进程组:可接受控制终端中的输入,也可输出数据到控制终端
    • 后台进程组:所有进程后台运行,无法接收终端中的输入,但可以输出数据到终端

问题:在终端中输入命令后,发生了什么?

当命令行 (shell) 运行命令后创建一个新的进程组

如果运行的命令中有多个子命令则创建多个进程 (处于新建的进程组中)

命令不带 &

  • shell 将新建的进程组设置为前台进程组,并将自己暂时设置为后台进程组

命令中带 &

  • shell 将新建的进程组设置为后台进程组,自己依旧是前台进程组

什么是终端进程组标识 (TPGID) ?

标识进程是否处于一个和终端相关的进程组中

前台进程组:TPGID == PGID

后台进程组:TPGID != PGID

若进程和任何终端无关:TPGID == 1

Linux 会话接口

#include <unistd.h>

pid_t getsid(pid_t pid);  // 获取指定进程的 SID,(pid == 0) => 当前进程

pid_t setsid(void);  // 调用进程不能是进程组长

  • 创建新会话,SID == PID,调用进程成为会话首进程
  • 创建新进程组,PGID == PID,调用进程成为进程组长
  • 调用进程没有控制终端,若调用前关联了控制终端,调用后与控制终端断联

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

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

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

相关文章

阿里云七代云服务器实例、倚天云服务器及通用算力型和经济型实例规格介绍

在目前阿里云的云服务器产品中&#xff0c;既有五代六代实例规格&#xff0c;也有七代和八代倚天云服务器&#xff0c;同时还有通用算力型及经济型这些刚推出不久的新品云服务器实例&#xff0c;其中第五代实例规格目前不在是主推的实例规格了&#xff0c;现在主售的实例规格是…

【C++进阶(六)】STL大法--栈和队列深度剖析优先级队列适配器原理

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 栈和队列 1. 前言2. 栈和队列的接口函数熟悉3. …

Java基础面试题精选:深入探讨哈希表、链表和接口等

目录 1.ArrayList和LinkedList有什么区别&#xff1f;&#x1f512; 2.ArrayList和Vector有什么区别&#xff1f;&#x1f512; 3.抽象类和普通类有什么区别&#xff1f;&#x1f512; 4.抽象类和接口有什么区别&#xff1f;&#x1f512; 5.HashMap和Hashtable有什么区别&…

[C++ 网络协议] 异步通知I/O模型

1.什么是异步通知I/O模型 如图是同步I/O函数的调用时间流&#xff1a; 如图是异步I/O函数的调用时间流&#xff1a; 可以看出&#xff0c;同异步的差别主要是在时间流上的不一致。select属于同步I/O模型。epoll不确定是不是属于异步I/O模型&#xff0c;这个在概念上有些混乱&a…

基于TOTP算法的Github两步验证2FA(双因子)机制Python3.10实现

从今年(2023)三月份开始&#xff0c;Github开始强制用户开启两步验证2FA(双因子)登录验证&#xff0c;毫无疑问&#xff0c;是出于安全层面的考虑&#xff0c;毕竟Github账号一旦被盗&#xff0c;所有代码仓库都会毁于一旦&#xff0c;关于双因子登录的必要性请参见&#xff1a…

(三)Python变量类型和运算符

所有的编程语言都支持变量&#xff0c;Python 也不例外。变量是编程的起点&#xff0c;程序需要将数据存储到变量中。 变量在 Python 内部是有类型的&#xff0c;比如 int、float 等&#xff0c;但是我们在编程时无需关注变量类型&#xff0c;所有的变量都无需提前声明&#x…

快速将iPhone大量照片快速传输到电脑的办法!

很多使用iPhone 的朋友要将照片传到电脑时&#xff0c;第一时间都只想到用iTunes 或iCloud&#xff0c;但这2个工具真的都非常难用&#xff0c;今天小编分享牛学长苹果数据管理工具的照片传输功能&#xff0c;他可以快速的将iPhone照片传输到电脑上&#xff0c;并且支持最新的i…

C语言实现——简易通讯录

前言&#xff1a;小伙伴们又见面啦&#xff01;这几天通过我们对自定义数据类型的学习&#xff0c;我们已经掌握了如何同时对多种数据类型进行管理&#xff0c;那么今天这篇文章&#xff0c;我们就来干一件大事——实现简易的通讯录。 一.思路分析 先来想想通讯录有哪些功能&a…

Python 爬虫 / web 面试常见问题

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备好了&#xff0c;直接在文末名片自取就可 爬虫面试常见…

No145.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

卸载无用Mac电脑软件应用程序方法教程

如何在Mac电脑卸载应用程序&#xff1f;Mac OS系统的用户卸载软件时&#xff0c;大部分会选择直接将软件图标拖进废纸篓清倒。这种操作会留下大量程序残余文件占据磁盘空间&#xff0c;手动清理又怕误删文件&#xff0c;有时还会遇到无法移除的恶意/流氓软件。小编今天分享3种可…

Unity 制作登录功能02-创建和链接数据库(SQlite)

国际惯例&#xff1a;先看效果 1.SQlite是一种嵌入型数据库 在Unity开发游戏时使用SQLite有多种原因&#xff0c;以下是其中一些主要原因&#xff1a; 嵌入式数据库&#xff1a;SQLite是一个嵌入式数据库引擎&#xff0c;这意味着它不需要单独的服务器进程。这使得使用SQLite非…