当前位置: 首页 > news >正文

UNIX环境高级编程——进程关系

9.1 引言

本章详细说明进程组以及会话的概念,还将介绍登录shell(登录时所调用的)和所有从登录shell启动的进程之间的关系。

9.2 终端登录

在这里插入图片描述

9.3 网络登录

在这里插入图片描述

9.4 进程组

  • 每个进程除了有一进程ID之外,还属于一个进程组,进程组是一个或多个进程的集合;
  • 同一进程组中的各进程接收来自同一终端的各种信号;
  • 每个进程组有一个唯一的进程组ID,它是一个正整数。

getpgrp函数返回调用进程的进程组ID:

#include <unistd.h>pid_t getpgrp(void);// 返回值:调用进程的进程组ID 

getpgid函数返回指定进程的进程组ID:

#include <unistd.h>pid_t getpgid(pid_t pid);// 返回值:若成功,返回进程组ID;若出错,返回-1
  • pid参数是0,返回调用进程的进程组ID,即getpgid(0)等效于个getpgrp()。

进程组相关概念:

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

进程调用setpgid可以加入一个现有的进程组或者创建一个新进程组:

#include <unistd.h>int setpgid(pid_t pid, pid_t pgid);// 返回值:若成功,返回0;若出错,返回-1
  • 函数将pid进程的进程组ID设置为pgid
  • 如果两个参数相等,则由pid指定的进程变成组长进程;
  • 如果pid0,则使用调用者的进程ID;
  • 如果pgid0,则由pid指定的进程ID用作进程组ID;
  • 一个进程只能为它自己或它的子进程设置进程组ID,且子进程调用了exec后,它就不再更改该子进程的进程组ID。

9.5 会话

会话是一个或多个进程组的集合。
在这里插入图片描述
进程调用setsid函数建立一个新会话:

#include <unistd.h>pid_t setsid(void);// 返回值:若成功,返回进程组ID;若出错,返回-1
  • 如果调用此函数的进程不是一个进程组的组长,则此函数创建一个新会话,具体会发生以下3件事:
    (1)该进程变成新会话的会话首进程(会话首进程是创建该会话的进程),此时,该进程是新会话中的唯一进程,可将会话首进程ID视为会话ID;
    (2)该进程成为一个新进程组的组长进程,新进程组ID是该调用进程的进程ID;
    (3)该进程没有控制终端(新会话没有控制终端),如果在调用setsid之前该进程有一个控制终端,那么这种联系也被切断。
  • 如果该调用进程已经是一个进程组的组长,则此函数返回出错。

getsid函数返回会话首进程的进程组ID:

#include <unistd.h>pid_t getsid(pid_t pid);// 返回值:若成功,返回会话首进程的进程组ID;若出错,返回-1
  • 如若pid是0,getsid返回调用进程的会话首进程的进程组ID;
  • 如若pid并不属于调用者所在的会话,那么调用进程就不能得到该会话首进程的进程组ID。

9.6 控制终端

会话和进程组还有一些其他特性:

  • 一个会话可以有一个控制终端,这通常是终端设备(在终端登录情况下)或伪终端设备(在网络登录情况下);
  • 建立与控制终端连接的会话首进程被称为控制进程
  • 一个会话中的几个进程组可被分为一个前台进程组以及一个或多个后台进程组
  • 如果一个会话有一个控制终端,则它有一个前台进程组,其他进程组为后台进程组;
  • 无论何时键入终端的中断键(常常是Delete或Ctrl+C),都会将中断信号发送至前台进程组的所有进程;
  • 无论何时键入终端的退出键(常常是Ctrl+\),都会将退出信号发送至前台进程组的所有进程;
  • 如果终端接口检测到调制解调器(或网络)已经断开连接,则将挂断信号发送至控制进程(会话首进程)。
    在这里插入图片描述

9.7 函数tcgetpgrp、tcsetpgrp和tcgetsid

需要有一种方法来通知内核哪一个进程组是前台进程组,这样,终端设备驱动程序就能知道将终端输入和终端产生的信号发送到何处:

#include <unistd.h>pid_t tcgetpgrp(int fd);// 返回值:若成功,返回前台进程组ID;若出错,返回-1
int tcsetpgrp(int fd, pid_t pgrpid);// 返回值:若成功,返回0;若出错,返回-1
  • 函数tcgetpgrp返回前台进程组ID,它与在fd上打开的终端相关联;
  • 如果进程有一个控制终端,则该进程可以调用tcsetpgrp将前台进程组ID设置为pgrpidpgrpid值应当是在同一会话中的一个进程组的ID,fd必须引用该会话的控制终端。

给出控制TTY的文件描述符,通过tcgetsid函数,应用程序就能获得会话首进程的进程组ID:

#include <termios.h>pid_t tcgetsid(int fd);// 返回值:若成功,返回会话首进程的进程组ID;若出错,返回-1

9.8 作业控制

3个特殊字符可使终端驱动程序产生信号,并将它们发送至前台进程组:

  • 中断字符(一般采用Delete或Ctrl+C)产生SIGINT
  • 退出字符(一般采用Ctrl+\)产生SIGQUIT
  • 挂起字符(一般采用Ctrl+Z)产生SIGTSTP

在这里插入图片描述

9.9 shell执行程序

shell处理管道的方式:

  • shell fork一个它自身的副本,然后此副本再为管道中的每条命令各fork一个进程;
  • 管道中的最后一个进程是shell的子进程,而执行管道中其他命令的进程则是该最后进程的子进程。

在这里插入图片描述

9.10 孤儿进程组

  • 一个其父进程已终止的进程称为孤儿进程,这种进程由init进程“收养”;
  • 整个进程组也可成为“孤儿”,孤儿进程组定义为:该组中每个成员的父进程要么是该组的一个成员,要么不是该组所属会话的成员。孤儿进程组的另一种描述:一个进程组不是孤儿进程组的条件是——该组中有一个进程,其父进程在属于同一会话的另一个组中。
  • 如果进程组不是孤儿进程组,那么在属于同一会话的另一个组中的父进程就有机会重新启动该组中停止的进程。

若父进程是由shell作为前台作业执行的,当父进程终止时,子进程变成后台进程组。

9.11 FreeBSD实现

在这里插入图片描述

9.12 实例代码

chapter9

相关文章:

UNIX环境高级编程——进程关系

9.1 引言 本章详细说明进程组以及会话的概念&#xff0c;还将介绍登录shell&#xff08;登录时所调用的&#xff09;和所有从登录shell启动的进程之间的关系。 9.2 终端登录 9.3 网络登录 9.4 进程组 每个进程除了有一进程ID之外&#xff0c;还属于一个进程组&#xff0c;进…...

C# ref和out用法和区别

首先&#xff1a;两者都是按地址传递的&#xff0c;使用后都将改变原来参数的数值。 其次&#xff1a;ref可以把参数的数值传递进函数&#xff0c;但是out是要把参数清空&#xff0c;就是说你无法把一个数值从out传递进去的&#xff0c;out进去后&#xff0c;参数的数值为空&am…...

信息复制的革命:印刷术【提高信噪比】

文章目录 引言I 保证信息不被噪音所影响1.1 校对抄写错误的方法1.2 印刷术II 雕版印刷和活字印刷2.1 雕版印刷术2.2 毕昇的胶泥活字印刷2.3 古腾堡的铅活字印刷引言 科学的诞生,丰富了信息产生的源头。文字和纸张,加速了信息的传播和文明的进步。I 保证信息不被噪音所影响 复…...

【MySQL】事务

事务是一组操作的集合,我们将一组操作视为一个整体,所以事务里面的操作的时候要么同时成功,要么同时失败,之所以会有事务也是因为我们在实际生活中会用到 最典型的例子就是转账操作:A向B进行转账,A这边扣款成功的同时B那边一定是收款成功的,如果没有事务的话就会出现A扣款成功但…...

学习HCIP的day.03

目录 OSPF&#xff1a;开放式最短路径优先协议 OSPF的数据包 -- 5种 OSPF的状态机 OSPF的工作过程 OSPF的基础配置 关于OSPF协议从邻居建立成为邻接的条件 OSPF的接口网络类型 OSPF&#xff1a;开放式最短路径优先协议 无类别链路状态型IGP协议&#xff1b;由于其基于拓…...

Maven项目的配置

Maven是什么&#xff1f;它的作用是什么&#xff1f; Maven是一种开源的构建工具&#xff0c;它可以自动化构建、测试、部署和管理Java项目。它提供了一个中心化的构建过程&#xff0c;包括依赖管理、项目结构管理、插件管理等&#xff0c;使得开发人员更方便地维护和协作应用…...

Spring Boot使用(基础)

目录 1.Spring Boot是什么? 2.Spring Boot使用 2.1Spring目录介绍 2.2SpringBoot的使用 1.Spring Boot是什么? Spring Boot就是Spring脚手架,就是为了简化Spring开发而诞生的 Spring Boot的优点: 1.快速集成框架,提供了秒级继承各种框架,提供了启动添加依赖的功能 2.内…...

6WINDGate-overview

6WINDGate Overview Author&#xff1a;Once Day Date&#xff1a;2023年4月29日 本文是对6WIND官网文档的整理和翻译&#xff0c;仅供学习和研究之用&#xff0c;原始文章可参考下面文档&#xff1a; 6WINDGate Documentation - 6WIND6WINDGate Modules — 6WINDGate Modul…...

Java8新特性-流式操作

在Java8中提供了新特性—流式操作&#xff0c;通过流式操作可以帮助我们对数据更快速的进行一些过滤、排序、去重、最大、最小等等操作并且内置了并行流将流划分成多个线程进行并行执行&#xff0c;提供更高效、快速的执行能力。接下来我们一起看看Java8为我们新增了哪些便捷呢…...

Nautilus Chain Layer 3 圆桌会议圆满举办,超4.8K用户观看

在 4 月 21 日&#xff0c;Nautilus Chain 举办了以 “Layer 3 区块链的意义和发展以及Crypto的演变”为主题的线上圆桌会议&#xff0c;我们邀请了众多行业嘉宾包括 GitcoinDAO社区管理者Bob jiang、Whalers Community 发起者崔棉大师、Chatpuppy 联合创始人 古千峰、Whalers …...

本地elasticsearch中文分词器 ik分词器安装及使用

ElasticSearch 内置了分词器&#xff0c;如标准分词器、简单分词器、空白词器等。但这些分词器对我们最常使用的中文并不友好&#xff0c;不能按我们的语言习惯进行分词。 ik分词器就是一个标准的中文分词器。它可以根据定义的字典对域进行分词&#xff0c;并且支持用户配置自…...

Java 中的异常处理机制是什么?如何使用它来处理程序中的异常?(七)

Java 中的异常处理机制是一种重要的编程技术&#xff0c;它能够帮助程序员更好地管理程序中出现的异常情况。本文将详细介绍 Java 中的异常处理机制&#xff0c;并提供示例来说明如何使用异常处理机制来捕获和处理程序中的异常。 什么是异常&#xff1f; 在程序运行过程中&am…...

基于UDQ的并网单相逆变器控制【同步参考系下单相并网全桥正弦PWM逆变器闭环控制】(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

JAVA开发——常用的注解

目录 spring spring MVC Spring Boot AOP MyBatis MyBatis-Plus JavaWeb开发 spring Autowired&#xff1a;自动安装&#xff0c;通过类匹配自动注册相应的Bean。 Component&#xff1a;将一个通用的 Java 类标记为 Bean&#xff0c;由 Spring 容器管理。 Controller&…...

【Java笔试强训 24】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;年终奖 …...

SpringCloud详解

SpringCloud是一个基于SpringBoot的分布式系统开发框架&#xff0c;它能够帮助我们快速、稳定地构建分布式系统。本篇博客将对SpringCloud进行详细解析&#xff0c;介绍SpringCloud的主要组件和相关应用场景&#xff0c;同时提供代码示例以帮助读者更好地掌握SpringCloud的实际…...

如何保障网络安全

网络安全是一个涵盖范围广、深入浅出的话题。随着互联网在现代社会中扮演的重要角色日益突出&#xff0c;网络安全问题成为各个领域所关注的焦点。在此&#xff0c;我们将从以下几个方面来阐述网络安全的重要性&#xff0c;并讨论几种保障网络安全的方式。 一、网络安全的重要性…...

网络基础:socket套接字

文章目录 1. 前导知识1.1 源MAC地址和目的MAC地址1.2 源IP地址和目的IP地址1.3 MAC地址和IP地址的配合1.4 源端口号和目的端口号1.5 Socket1.6 UCP协议和TCP协议1.7 网络字节序高低位高低地址大端和小端网络字节序常用转换函数 2. socket 网络编程2.1 socket 常见接口创建套接字…...

程序员如何学好PHP?做好这五个方面就够了

今天我想和大家分享一下程序员的第一份工作对自己的意义以及影响。首先&#xff0c;我们都知道第一份工作很重要&#xff0c;因为它决定了你以后的职业生涯的方向。你的第一份工作做的什么方向&#xff0c;很可能就是你以后职业生涯中最主要的方向。对我个人而言&#xff0c;我…...

【开源项目】Build your own X 构建自己的项目

【开源项目】Build your own X 构建自己的项目 简介 Build your own X 是一个精心收集了大量资源的项目指南&#xff0c;可以通过从头开始重新创建我们最喜爱的技术来掌握编程。 项目地址&#xff1a; https://github.com/codecrafters-io/build-your-own-x这些项目里的资源…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

《Offer来了:Java面试核心知识点精讲》大纲

文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...

向量几何的二元性:叉乘模长与内积投影的深层联系

在数学与物理的空间世界中&#xff0c;向量运算构成了理解几何结构的基石。叉乘&#xff08;外积&#xff09;与点积&#xff08;内积&#xff09;作为向量代数的两大支柱&#xff0c;表面上呈现出截然不同的几何意义与代数形式&#xff0c;却在深层次上揭示了向量间相互作用的…...

stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)

这是系统中断服务程序的默认处理汇编函数&#xff0c;如果我们没有定义实现某个中断函数&#xff0c;那么当stm32产生了该中断时&#xff0c;就会默认跑这里来了&#xff0c;所以我们打开了什么中断&#xff0c;一定要记得实现对应的系统中断函数&#xff0c;否则会进来一直循环…...

初级程序员入门指南

初级程序员入门指南 在数字化浪潮中&#xff0c;编程已然成为极具价值的技能。对于渴望踏入程序员行列的新手而言&#xff0c;明晰入门路径与必备知识是开启征程的关键。本文将为初级程序员提供全面的入门指引。 一、明确学习方向 &#xff08;一&#xff09;编程语言抉择 编…...