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

Linux进程关系

目录

1、无关系

2、父子进程关系

3、进程组

4、会话


在 Linux 系统中,每个进程都拥有一个唯一的标识符,即进程号(PID,Process ID),并有其独特的生命周期。每个进程都有一个父进程,而父进程也可能有更上一级的父进程,最终可以追溯到系统的根进程 init,形成一个进程家族树。当子进程结束时,父进程能够接收子进程的终止通知,并获取其退出状态。

除此之外,Linux 系统中的进程之间还存在其他层次关系,如进程组和会话。它们可以进一步拓展进程之间的关系,不仅局限于独立进程或父子进程关系,还包括进程组和会话等。

1、无关系

两个进程之间没有任何依赖关系,彼此独立运行,互不干扰。这类进程可以单独运行和终止,彼此之间没有任何联系。

2、父子进程关系

父子进程关系是通过 fork() 系统调用创建的。调用 fork() 的进程称为父进程,而被 fork() 创建出来的新进程称为子进程。父进程和子进程可以通过共享部分资源(如文件描述符)进行协作。

如果父进程在子进程之前终止,则子进程会被操作系统的 init 进程(PID 为 1)接管,此时 init 会成为其新的父进程,保证子进程的状态能够被处理。

3、进程组

每个进程除了有自己的进程 ID(PID)和父进程 ID(PPID)外,还隶属于一个进程组,其进程组 ID(PGID)用来标识它所属的进程组。进程组是为了简化多个进程的管理。例如,如果系统需要同时运行并管理多个相关进程,可以将它们归入同一个进程组,以便统一控制这些进程。

进程组的特点:

  • 每个进程必定隶属于某个进程组,且只能属于一个进程组。
  • 每个进程组有一个组长进程,其进程 ID 就是进程组的 PGID。
  • 通过在组长进程的 ID 前加负号,可以对整个进程组执行操作。
  • 即使组长进程终止,只要组内仍有其他进程,该进程组依然存在。
  • 新创建的进程会继承其父进程的进程组 ID,除非显式改变。

获取进程组 ID:通过 getpgrp()getpgid() 系统调用,用户可以获取进程的进程组 ID:

#include <unistd.h>
pid_t getpgid(pid_t pid);  // 获取指定进程的进程组 ID
pid_t getpgrp(void);       // 获取调用进程的进程组 ID

getpgrp() 等价于 getpgid(0),即获取调用进程的进程组 ID。 

设置进程组 ID:通过 setpgid() 系统调用,可以为某个进程设置新的进程组:

#include <unistd.h>
int setpgid(pid_t pid, pid_t pgid);

setpgid(pid, pgid)pid 指定的进程加入 pgid 进程组。

setpgrp()setpgid(0, 0) 的简写,用于创建一个新的进程组。

4、会话

会话是进程管理的另一层结构,包含一个或多个进程组。

会话与进程组之间的关系如下:

  • 一个会话可以包含多个进程组。
  • 每个会话只能有一个前台进程组,其它进程组则为后台进程组。
  • 会话的首领是创建该会话的进程,且会话首领也作为新的进程组的组长。

当用户在某个终端登录时,系统会创建一个新的会话。此时,前台进程组中的进程可以接受来自终端的输入和信号,比如 Ctrl + C 产生的 SIGINT 信号。

获取会话 ID:通过 getsid() 系统调用可以获取某个进程的会话 ID:

#include <unistd.h>
pid_t getsid(pid_t pid);

如果参数 pid 为 0,则返回调用进程的会话 ID。

创建新会话:通过 setsid() 系统调用,当前进程可以创建一个新的会话,并成为该会话的会话首领和新的进程组组长:

#include <unistd.h>
pid_t setsid(void);

调用成功后,setsid() 返回新的会话 ID。

Linux 系统通过进程 ID、父子进程关系、进程组和会话等层次结构,提供了灵活的进程管理方式。进程组简化了对多个相关进程的管理,而会话机制则在多终端、多用户环境下起着重要作用。通过系统调用,用户可以精确控制这些进程关系,以实现复杂的进程管理任务。

http://www.xdnf.cn/news/14676.html

相关文章:

  • Flutter 网络请求指南, 从 iOS 到 Flutter 的 Dio + Retrofit 组合
  • 飞算科技依托 JavaAI 核心技术,打造企业级智能开发全场景方案
  • 数据应该如何组织,才能让Excel“读懂”?
  • Django ORM 1. 创建模型(Model)
  • 【2024 CVPR-Backbone】RepViT: Revisiting Mobile CNN From ViT Perspective
  • 什么是上证50etf期权波动率?
  • CPT204-Advanced OO Programming: Lists, Stacks, Queues, and Priority Queues
  • 工作台-02.代码开发
  • HTTP协议中Connection: Keep-Alive和Keep-Alive: timeout=60, max=100的作用
  • 什么是国际期货?期货交易平台搭建
  • [ linux-系统 ] 磁盘与文件系统
  • 【大模型实战 | BERT 量化分析(2)】
  • 从萌芽到领航:广州华锐互动的 AR 奋进之路​
  • 【github】从本地更新仓库里的文件笔记
  • MCP-安全(代码实例)
  • oracle基础审计管理
  • 【Linux指南】压缩、网络传输与系统工具
  • 2025.6.26总结
  • Kotlin环境搭建与基础语法入门
  • springcloud 尚硅谷 看到9开头
  • linux cp与mv那个更可靠
  • MySQL5.7和8.0 破解root密码
  • mysql之timestamp字段自动更新问题
  • ISP Pipeline(5): Auto White Balance Gain Control (AWB) 自动白平衡
  • 教程 | 一键批量下载 Dify「Markdown 转 Docx」生成的 Word 文件(附源码)
  • 【AI News | 20250626】每日AI进展
  • 兰洋科技上合组织论坛发表专题分享,全球液冷布局引领绿色算力未来
  • QNX 编译框架梳理(草稿 10%)
  • (LeetCode 面试经典 150 题 ) 55. 跳跃游戏 (贪心)
  • 279. 完全平方数