进程组.会话.终端

news2024/11/24 20:46:55

在这里插入图片描述

一.进程组.会话.终端概念

1.1进程组

在Linux操作系统中,进程组(Process Group)是一组进程的集合。进程组内的每个进程都有一个相同的进程组ID(PGID)。进程组可以用于进行作业控制、信号传递和进程状态管理等操作。

每个进程组都有一个组长进程,其进程ID(PID)等于进程组ID(PGID)。通常,进程组的第一个进程会成为组长进程。

进程组主要有以下特点:

  1. 创建进程组:可以通过setpgid()系统调用将进程添加到指定的进程组或创建一个新的进程组。常见的方式是使用fork()exec()函数,子进程可以通过setpgid(0, 0)将自己加入到新进程组,或者使用setpgid(pid, pgid)将指定进程加入到现有进程组。

  2. 进程组ID:进程组ID(PGID)是一个非负整数,用于唯一标识一个进程组。进程组ID由操作系统分配并在进程组创建时指定。

  3. 进程组的作用:进程组常用于作业控制和信号传递。作业控制通过对进程组的操作来管理一组相关联的进程,例如发送信号给整个进程组、暂停或恢复进程组中的所有进程等。

  4. 进程组的关系:进程组不存在嵌套关系,每个进程组都是扁平的,不包含其他进程组。然而,一个进程可以同时属于多个进程组,即多个进程组ID与其PID相等。这在进行作业控制和信号传递时可能有用。

总而言之,进程组是一组拥有相同进程组ID的进程的集合。它们提供了一种对进程进行组织和管理的机制,并在作业控制、信号传递和进程状态管理等方面发挥重要作用。

1.2父进程和子进程

当进程调用了 fork() 函数创建子进程时,子进程会成为父进程的副本,包括进程组的关系。在默认情况下,父子进程会属于同一个进程组,且父进程作为进程组的组长。具体来说:

  • fork() 函数调用后,子进程将会获得父进程的副本,包括进程组ID(PGID)。

  • 父进程的进程组ID(PGID)不会改变,即父进程仍然是进程组的组长。

  • 子进程的进程组ID(PGID)将与父进程相同。

这意味着,父进程和子进程将属于同一个进程组,且父进程仍然是进程组的组长。

需要注意的是,在某些特定的情况下,父进程可能会在 fork() 后修改子进程的进程组ID(PGID),或者子进程可能会通过调用相关的系统调用来修改自己的进程组ID(PGID)。

总结起来,当进程调用了 fork() 函数创建子进程时,默认情况下,父子进程将属于同一个进程组,且父进程仍然是进程组的组长。子进程将继承父进程的进程组ID(PGID)。尽管如此,父进程和子进程仍然可以通过相关的系统调用修改自己的进程组ID(PGID)。

1.3shell的管道

在 shell 中通过管道连接的应用程序,确实会创建一个进程组,并且第一个程序成为进程组的组长。

当在 shell 中使用管道 | 连接两个应用程序时,shell 会创建一个子进程来执行第一个应用程序,并将其设为进程组的组长。然后,shell 创建另一个子进程来执行第二个应用程序,并将其加入到与第一个应用程序相同的进程组中。这样,两个应用程序就属于同一个进程组,且第一个应用程序成为该进程组的组长。

此设计的目的是为了能够对整个管道进行作业控制和信号传递。作业控制允许用户对一组相关联的进程进行统一管理,而信号传递可以在需要的时候将信号发送给整个进程组。

需要注意的是,由于管道中的进程是通过管道进行输入和输出的,它们之间的通信是通过内核缓冲区进行的,而不是直接的进程间通信。

总结起来,在 shell 中通过管道连接的应用程序,这两个程序属于同一个进程组,第一个程序成为进程组的组长,这样可以方便进行作业控制和信号传递。

1.4shell执行一个程序

在 shell 中直接执行一个应用程序时,对于大部分进程来说,它们自身成为一个独立的进程组,因此进程组中只包含一个进程。

当在 shell 中执行一个应用程序时,shell 会创建一个子进程来执行该应用程序。这个子进程成为一个独立的进程组,进程组ID(PGID)和进程ID(PID)相同。这意味着该进程是进程组中唯一的进程,也是进程组的组长。

在这种情况下,进程组的目的可能不是为了作业控制或信号传递,而是为了在执行过程中将其与其他进程分隔开,以获得更好的隔离性和独立性。

需要注意的是,这只适用于大部分的情况。在某些特殊的情况下,应用程序可能会以其他方式创建自己的进程组,或者与其他进程共享进程组。这种情况是因为应用程序的特殊需求而进行的特定处理。

总结起来,当在 shell 中直接执行一个应用程序时,这个应用程序通常会成为一个独立的进程组,进程组中只包含一个进程。这种设计可以提供进程的隔离性和独立性。但需要注意的是,在特殊情况下,应用程序可能会以其他方式创建进程组或与其他进程共享进程组。

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

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

相关文章

大模型+检索增强(RAG、Atlas 和 REPLUG)

https://zhuanlan.zhihu.com/p/651380539 https://github.com/ninehills/blog/issues/97 1. 检索增强生成 RAG 在问答和对话的场景下,通常可以通过检索和生成两种方式得到一个回复。检索式回复是在外部知识库中检索出满意的回复,较为可靠和可控&#…

如何使用 MATLAB 数学编程软件调用 Python 脚本详细教程(每周更新中)

MATLAB 读写操作 在 MATLAB 中,可以使用各种函数来读取和写入文件。其中,filename.txt 是要读取或写入的文件名,r 表示读取模式,w 表示写入模式。fscanf 和 fprintf 函数用于读取和写入文件内容,%c 和 %s 是格式说明符…

Python 通过 stomp 发送消息到 ActiveMQ 的代码

只需要下面简单的几行代码,我们就可以把我们本地数据发送到 ActiveMQ 上面去。 def send_mq(data):hosts [(AMQHOST, AMQPORT)]conn stomp.Connection(host_and_portshosts, auto_content_lengthFalse)conn.connect(usernameAMQUSER, passcodeAMQPASS, waitTrue)…

基于Spring Boot的医院预约挂号系统设计与实现

前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…

功夫再高也怕菜刀。多年经验,会独立开发的机器视觉工程师,技术太强,但是找工作能力差劲

功夫再高也怕菜刀,专业的事情交给专业的人去做。 今年7月份中旬的时候,遇到一位老朋友,向我咨询某公司的信息,其实我根本不了解这家公司的情况与实力,向他说了,抱歉,我查下,等我晚上…

怎么把利用paddlepaddle导出的json文件转化为yolo或者voc文件

这两天想偷懒,想让模型先在数据上标一遍,然后我再做修正,主要是图个省事。由于我们的业务主要是利用paddle,模型也是基于paddle推理的,因此即便我对paddle有一万个吐槽但也不得不用它。但在利用paddle保存推理结果文件时&#xff…

Linux Day17 生产者消费者

一、生产者消费者问题概述 生产者 / 消费者问题,也被称作有限缓冲问题。两个或者更多的线程共享同一个缓冲 区,其中一个或多个线程作为 “ 生产者 ” 会不断地向缓冲区中添加数据,另一个或者多个线程作为 “ 消费者 ” 从缓冲区中取走数据。…

搭建本地MQTT服务器

环境及所用工具 win10本地环境下,使用docker配置一个mqttbroker,选择emqx docker操作:Docker_liangchaaaaa的博客-CSDN博客 测试使用MQTTX软件 Docker拉取镜像仓库 docker pull emqx/emqx:4.2.5 可以上官网看最新版本,或直接…

vue动态修改浏览器title和icon图标

vue动态修改浏览器title和icon图标 实例代码 setTitleIcon(){var link document.querySelector("link[rel*icon]") || document.createElement(link);link.type image/x-icon;link.rel shortcut icon;link.href /002.png; // 图片放public目录document.getElem…

PHP8的类与对象的基本操作之类的实例化-PHP8知识详解

定义完类和方法后,并不是真正创建一个对象。类和对象可以描述为如下关系。类用来描述具有相同数据结构和特征的“一组对象”,“类”是“对象”的抽象,而“对象”是“类”的具体实例,即一个类中的对象具有相同的“型”,…

循环神经网络-02文本预处理

https://zh-v2.d2l.ai/chapter_recurrent-neural-networks/text-preprocessing.html 本节中,我们将解析文本的常见预处理步骤。 这些步骤通常包括: 将文本作为字符串加载到内存中。 将字符串拆分为词元(如单词和字符)。 建立一个…

QT---day3---9.19

1> 完成文本编辑器的保存工作 ui界面&#xff1a; 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QFontDialog> #include <QMessageBox> #include <QColor> #include <QColorDialog> #include <QFo…

计算机竞赛 深度学习 python opencv 实现人脸年龄性别识别

文章目录 0 前言1 项目课题介绍2 关键技术2.1 卷积神经网络2.2 卷积层2.3 池化层2.4 激活函数&#xff1a;2.5 全连接层 3 使用tensorflow中keras模块实现卷积神经网络4 Keras介绍4.1 Keras深度学习模型4.2 Keras中重要的预定义对象4.3 Keras的网络层构造 5 数据集处理训练5.1 …

IDEA全局替换快捷键有大坑---详解

1、ctl shift r 可选择范围最小就是包 那么必然就会造成全局替换过了&#xff01;&#xff01;&#xff01;&#xff01; 2、ctl r实现当前类全局替换 因为这个坑&#xff0c;浪费大爷我2小时。艹

认识一下Git

目录 Git Git下载 Git安装 Git初始化 Git操作 Git、GitLab、和Eclipse是公司中软件开发常用的组合&#xff1a; 1. Git&#xff1a;Git是一种分布式版本控制系统&#xff0c;用于跟踪文件和代码的变化。它提供了管理代码仓库的功能&#xff0c;可以记录每次提交的修改&am…

Python语言:列表初体验

列表是Python中的一个对象&#xff0c;他类似于C语言中的数组&#xff0c;可以存储许多数据&#xff0c;也可以称之为数据集合。他原则是可以存储不同类型的数据&#xff0c;一般不建议这样使用&#xff0c;有点奇怪&#xff1b;一般情况下一个列表中保存的都是同一种类型的数据…

Matlab中 * 与 .* 的区别

* 用于矩阵乘法 示例1&#xff1a; 注&#xff1a; 表示转置&#xff0c;即矩阵a的转置 乘以 矩阵b 根据矩阵乘法&#xff0c;r结果为&#xff1a; 示例2&#xff1a; 矩阵a 乘以 矩阵b的转置 根据矩阵乘法&#xff0c;结果为&#xff1a; .* 用于对应位置单个元素相乘 示例…

【虚幻引擎】UE5 VLC接入网络监控、视频直播、网络直播支持RTSP、RTMP

一、如何更新自己的插件匹配自己想要的UE版本 我们在网上下载的插件一般是UE4版本的插件&#xff0c;这个时候就需要我们自己去修改编译&#xff0c;接下来教大家修改插件来适配自己的引擎。 如果不想自己编译代码&#xff0c;可以直接找我拿编译好的UE5.0、UE5.1、UE5.2的插件…

[hive]搭建hive3.1.2hiveserver2高可用可hive metastore高可用

参考: Apache hive 3.1.2从单机到高可用部署 HiveServer2高可用 Metastore高可用 hive on spark hiveserver2 web UI 高可用集群启动脚本_薛定谔的猫不吃猫粮的博客-CSDN博客 没用里头的hive on spark,测试后发现版本冲突 一、Hive 集群规划(蓝色部分) ck1ck2ck3Secondary…

Meow

环境准备 操作系统:Kali Linux 或者 Windows工具:nmap,telnet nmap工具 [Kali 官网] 手册地址:https://www.kali.org/tools/nmap/ 摘要: Nmap is a utility for network exploration or security auditing. It supports ping scanning (determine which hosts are up), many…