前台、后台、守护进程对比,进程组的相关函数

news2025/2/22 21:48:28

前台进程,后台进程,守护进程的对比

在前面我们已经了解了前台进程,后台进程,守护进程。

直接在终端中输入命令: 这是最常见的启动前台进程的方式。例如,在终端中输入 ./myprogram 就可以启动 myprogram 程序,它会作为前台进程运行。

在命令末尾添加 & 符号:这是最简单直接启动后台进程的方法。在终端中输入命令时,在命令的末尾添加 & 符号,然后按下回车键,程序就会在后台启动。例如:./myprogram &

守护进程创建启动方式我们在上一篇文章中已经详细介绍过了。

进程占用进程组的问题

默认启动一个进程时,这个进程本身就会单独占据一个进程组

  • 默认行为: 默认情况下,当我们启动一个程序时,操作系统会自动将该程序放入一个进程组中。
  • 进程组组长: 进程组中的第一个进程(通常是启动的那个进程)会自动成为该进程组的组长。

举例说明:

假设我们在终端中输入 ./myprogram 命令或者./myprogram & 命令启动了一个名为 myprogram 的程序。

  • 操作系统会自动创建一个新的进程组,并为该进程组分配一个唯一的PGID。
  • myprogram 程序会成为这个进程组的组长。
  • 这个进程组只包含 myprogram 这一个进程。

使用./myprogram 命令启动进程之后这个进程被放到了前台进程组,并且这个进程中创建的子进程也是在前台进程组中。

使用./myprogram &命令启动进程之后这个进程被放到了后台进程组,并且这个进程中创建的子进程也是在后台进程组中。

下面一些情况下进程不会单独占据一个进程组

父进程创建子进程

  • 当一个进程(父进程)使用 fork() 函数创建子进程时,子进程默认会加入到父进程所在的进程组。
  • 这意味着父进程和子进程会共享同一个进程组ID(PGID)。
  • 这种情况下,子进程不会单独占据一个进程组,而是与父进程共享同一个进程组。

进程加入已存在的进程组

  • 一个进程可以使用 setpgid() 函数加入到一个已存在的进程组。
  • 如果一个进程加入了其他进程已存在的进程组,那么它就不会单独占据一个进程组。

setpgid函数介绍

函数作用:改变进程的进程组

函数原型:int setpgid(pid_t pid, pid_t pgid);

参数介绍

pid:要加入进程组的进程的进程 ID(PID)。如果 pid 为 0,则表示调用进程本身。

pgid:目标加入进程组 ID(PGID)。如果 pgid 为 0,则表示将进程设置为其 PID 所对应的进程组。若目标进程组 ID 为一个合法的进程组 ID,则调用进程将加入该进程组。

返回值介绍

  • 成功时返回 0
  • 失败时返回 -1,并设置 errno 为相应的错误码。

常见使用情景

  • 父子进程的关系:子进程在默认情况下会继承父进程的进程组 ID。如果父进程的进程组 ID 是 pgid,那么子进程也会属于同一个进程组。通过 setpgid(),可以显式地改变进程组的归属。
    比如可以通过setpgid()来让子进程单独占据一个进程组
     
  • 进程组和信号:进程组之间可以通过信号来进行通信,setpgid() 允许你根据需要来控制进程的分组。你可以将多个进程组织到一个进程组中,然后使用信号(如 kill())向整个进程组发送信号。

注意点

进程使用setsid() 函数用于创建一个新的会话,要求调用进程不能是进程组的组长。进程调用setpgid() 函数的时候,并没有要求调用进程不能是进程组的组长。注意不要混淆。

进程使用setpgid() 函数之后只是将进程所属的进程组变了,它仍然是原来的父进程的子进程setpgid() 函数只影响进程所属的进程组,而不改变进程的父子关系

补充说明(先看)

由于进程改变所属的进程组这个操作其实比较少见,所以这里对于setpgid函数的详细使用例子我也没给出来,只是介绍了函数的用法,感兴趣的读者可以自行学习。另外关于进程组相关的函数接口还有一个比较重要,但是本文没有提到的是 pid_t getpgid(pid_t pid); 这个函数接口用于获取指定进程的进程组ID,使用方法很简单,这里我也不多赘述。

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

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

相关文章

openAI最新o1模型 推理能力上表现出色 准确性方面提升 API如何接入?

OpenAI o1模型在回答问题前会进行深入思考,并生成一条内部推理链,使其在尝试解决问题时可以识别并纠正错误,将复杂的步骤分解为更简单的部分,并在当前方法无效时尝试不同的途径。据悉,o1不仅数学水平与美国奥林匹克竞赛…

跨平台键鼠共享免费方案--Deskflow!流畅体验用MacBook高效控制Windows设备

在混合办公场景中,多设备协同已成为提升效率的关键需求。对于同时使用Mac与Windows设备的用户,如何通过一套键盘和触控板实现无缝切换,避免桌面空间浪费与操作冗余?本文将基于开源工具Deskflow,提供一套专业级解决方案…

CAS单点登录(第7版)27.开发人员

如有疑问,请看视频:CAS单点登录(第7版) 开发人员 Javadocs文档 group org.apereo.cas has published 42 artifact(s) with total 8210 version(s) org.apereo.cas org apereo.cas 小组已出版 42 件作品,共 8210 个版…

算法与数据结构(多数元素)

题目 思路 方法一:哈希表 因为要求出现次数最多的元素,所以我们可以使用哈希映射存储每个元素及其出现的次数。每次记录出现的次数若比最大次数大,则替换。 方法二:摩尔算法 摩尔的核心算法就是对抗,因为存在次数多…

【2.10-2.16学习周报】

文章目录 摘要Abstract一、理论方法介绍1.模糊类增量学习2.Rainbow Memory(RM)2.1多样性感知内存更新2.2通过数据增强增强样本多样性(DA) 二、实验1.实验概况2.RM核心代码3.实验结果 总结 摘要 本博客概述了文章《Rainbow Memory: Continual Learning with a Memory of Divers…

python包的管理

管理python包 python能跻身最欢迎编程语言前列的一个主要原因是python有着活跃的社区提供丰富的包,诸如numpy,pandas,scikit-learn等等。 python的包都存放PyPI中,PyPI即Python Package Index,是python的软件仓库。所…

我用 Cursor 开发了一款个人小记系统

https://note.iiter.cn 项目背景 在日常工作和学习中,我们经常需要快速记录一些想法、收藏一些有用的链接或者保存一些重要的文本、图片内容。虽然市面上已经有很多笔记软件,但我想要一个更轻量、更简单的工具,专注于快速记录和智能检索。于是我开发了这款个人小记系统。 系统…

安全测试中的身份认证与访问控制深度解析

第一部分:基本概念与核心问题 1. 身份认证与访问控制基础 1.1 身份认证三要素 知识因素(密码、PIN码)持有因素(硬件令牌、手机)生物因素(指纹、面部识别)1.2 访问控制模型 DAC(自主访问控制)MAC(强制访问控制)RBAC(基于角色的访问控制)2. 关键安全机制 2.1 会话…

代码随想录-训练营-day30

今天我们要进入动态规划的背包问题,背包问题也是一类经典问题了。总的来说可以分为: 今天让我们先来复习0-1背包的题目,这也是所有背包问题的基础。所谓的0-1背包问题一般来说就是给一个背包带有最大容量,然后给一个物体对应的需要…

全平台搭载旭日5!科沃斯GOAT智能割草机器人全新系列正式开售

要闻 近日,科沃斯全新发布的GOAT A Series 和 GOAT O Series割草机器人,将在多国市场正式上市发售。作为业界最强的割草机器人产品之一,GOAT致力为割草机带来基于机器人视觉的专业定位解决方案。科沃斯GOAT全新系列产品全平台搭载地瓜机器人…

自定义组件数据监听器案例,纯数据字段,自定义组件生命周期,页面的生命周期,插槽

1.自定义组件数据监听器案例 1.1基础案例模板 1.2定义button事件的处理函数 1.3监听对象中属性的变化,并且为fullColor赋值 使用通配符监听所有属性变化 2.自定义组件的纯数据字段 、 3.自定义组件的生命周期 4.组件所在页面的生命周期 5.自定义组件插槽 5.1单个插…

mybatis-lombok工具包介绍

Lombok是一个实用的]ava类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发、提高效率。 使用前要加入Lombok依赖

LDO技术:线性调整率与负载调整率全解析

LDO(Low Dropout Regulator)低压差线性稳压器,其结构比较简单、纹波和噪声比DCDC小、成本也优于DCDC,缺点是在输入电压和输出电压的压差比较大时,效率低些,但在小电流电源电路上被广泛使用。现在输入电压和输出电压的压差可做到10…

SpringBoot 集成 Caffeine 实现本地缓存

目录 1、Caffeine 简介 1.1、Caffeine 简介1.2、对比 Guava cache 的性能主要优化项1.3、常见的缓存淘汰算法1.4、SpringBoot 集成 Caffeine 两种方式 2、SpringBoot 集成 Caffeine 方式一 2.1、缓存加载策略 2.1.1、手动加载2.1.2、自动加载【Loading Cache】2.1.3、异步加载…

使用EVE-NE-锐捷实现NAT+ACL服务限制

一、项目拓扑 二、项目实现 1.NET配置 点击左侧的NetWorks,设置与图相同的配置,实现实验环境桥接到物理网络 2.GW配置 进入特权模式 enable进入全局模式 configure terminal 更改名称为GW hostname GW进入g0/0接口 interface g0/0将g0/0接口IP地址配置为192.168.…

大模型训练为什么依赖GPU

近年来,随着人工智能技术的飞速发展,特别是深度学习领域的进步,大模型的训练逐渐成为研究和工业界的热点。作为大模型训练中的核心硬件,GPU(图形处理单元)扮演了至关重要的角色。那么,为什么大模…

二叉树链式结构:数据结构中的灵动之舞

目录 前言 一、 前置说明 二、二叉树的遍历 2.1前序遍历 2.2中序遍历 2.3 后序遍历 2.4层序遍历 三、二叉树的遍历的应用 3.1二叉树节点个数: 3.2二叉树的高度 3.3 二叉树第k层的节点的个数 3.4二叉树的查找 总结 前言 在数据结构的世界里,二叉…

新建github操作

1.在github.com的主页根据提示新建一个depository。 2.配置用户名和邮箱 git config --global user.name "name" git config --global user.email "email" 3.生成ssh秘钥 ssh-keygen -t rsa 找到public key 对应的文件路径 cat /root/.ssh/id_rsa 复制显…

第 15 天:数据存储,打造存档 读取系统!

🎯 目标: ✅ 掌握 UE5 SaveGame 存档系统 ✅ 在 C 创建存档类,存储游戏数据 ✅ 实现存档 & 读取功能,让游戏状态可持久化 ✅ 在 BP_PlayerCharacter 里实现: * 游戏开始时自动加载存档 * 玩家受到伤害时自动存档 …

Flutter 异步编程利器:Future 与 Stream 深度解析

目录 一、Future:处理单次异步操作 1. 概念解读 2. 使用场景 3. 基本用法 3.1 创建 Future 3.2 使用 then 消费 Future 3.3 特性 二、Stream:处理连续异步事件流 1. 概念解读 2. 使用场景 3. 基本用法 3.1 创建 Stream 3.2 监听 Stream 3.…