
🎬 个人主页 :艾莉丝努力练剑
❄专栏传送门 :《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》
《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》
⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平
🎬 艾莉丝的简介:

文章目录
- [1 ~> 所有IPC资源是统一管理的!](#1 ~> 所有IPC资源是统一管理的!)
-
- [1.1 统一管理范式](#1.1 统一管理范式)
- [1.2 ipc _ perm 结构体详解](#1.2 ipc _ perm 结构体详解)
- [1.3 全局管理变量](#1.3 全局管理变量)
- [2 ~> 具体资源结构体](#2 ~> 具体资源结构体)
-
- [2.1 消息队列结构 msgid _ ds](#2.1 消息队列结构 msgid _ ds)
- [2.2 信号量结构 semid _ ds](#2.2 信号量结构 semid _ ds)
- [2.3 共享内存 - struct shmid _ ds](#2.3 共享内存 - struct shmid _ ds)
- [3 ~> 内核管理抽象: ipc _ ids](#3 ~> 内核管理抽象: ipc _ ids)
-
- [3.1 核心设计思想](#3.1 核心设计思想)
- [3.2 C 语言面向对象特性运用](#3.2 C 语言面向对象特性运用)
- [4 ~> IPC 资源流转逻辑](#4 ~> IPC 资源流转逻辑)
-
- [4.1 统一管理流程](#4.1 统一管理流程)
- [4.2 消息队列示例流程](#4.2 消息队列示例流程)
- [5 ~> C语言模拟面向对象的经典案例对比](#5 ~> C语言模拟面向对象的经典案例对比)
- [6 ~> 共享内存与文件内存映射](#6 ~> 共享内存与文件内存映射)
-
- [6.1 核心关联结构](#6.1 核心关联结构)
- [6.2 系统调用流程](#6.2 系统调用流程)
- [6.3 核心设计思想](#6.3 核心设计思想)
- [7 ~> 命令行工具:ipcs](#7 ~> 命令行工具:ipcs)
-
- [7.1 查看共享内存](#7.1 查看共享内存)
- [7.2 查看消息队列](#7.2 查看消息队列)
- [7.3 查看信号量](#7.3 查看信号量)
- [7.4 查看所有 IPC 资源](#7.4 查看所有 IPC 资源)
- 结尾

1 ~> 所有IPC资源是统一管理的!
1.1 统一管理范式
System V IPC(进程间通信)资源由操作系统统一管理。内核通过 struct ipc_perm 结构体作为所有 IPC 资源的"管理头",实现统一的管理标准。无论是消息队列、信号量还是共享内存,它们的管理结构体都以 struct ipc_perm 开头。
System V------ 在操作系统内部,是如何管理所有的IPC资源呢?
- System V标准:操作接口类似
- 这三个标准属性类似:都有key成员

操作系统OS是统一管理所有IPC资源的!------不管你是啥都是同一种方案。
1.2 ipc _ perm 结构体详解
c
struct ipc_perm {
key_t key; // 供 shmget(2) 等系统调用使用的键值
uid_t uid; // 资源拥有者的有效用户 ID
gid_t gid; // 资源拥有者的有效组 ID
uid_t cuid; // 资源创建者的有效用户 ID
gid_t cgid; // 资源创建者的有效组 ID
unsigned short mode; // 权限位 + SHM_DEST 和 SHM_LOCKED 标记
unsigned short seq; // 序列号
};
1.3 全局管理变量
内核通过三个全局静态变量分别管理三类 IPC 资源:
c
static struct ipc_ids msg_ids; // 消息队列(Message Queue)
static struct ipc_ids sem_ids; // 信号量(Semaphore)
static struct ipc_ids shm_ids; // 共享内存(Shared Memory)
2 ~> 具体资源结构体
2.1 消息队列结构 msgid _ ds
c
struct msgid_ds {
struct ipc_perm msg_perm; // 继承自 ipc_perm
time_t msg_stime; // 最后发送消息时间
time_t msg_rtime; // 最后接收消息时间
time_t msg_ctime; // 最后修改时间
unsigned long msg_qnum; // 队列中当前消息数量
// ... 其他字段
};
2.2 信号量结构 semid _ ds
c
struct semid_ds {
struct ipc_perm sem_perm; // 继承自 ipc_perm
time_t sem_otime; // 最后操作时间
time_t sem_ctime; // 最后修改时间
// ... 信号量集相关信息
};
2.3 共享内存 - struct shmid _ ds
c
struct shmid_ds {
struct ipc_perm shm_perm; // 继承自 ipc_perm
size_t shm_segsz; // 共享内存段大小
time_t shm_atime; // 最后附加时间
time_t shm_dtime; // 最后分离时间
time_t shm_ctime; // 最后修改时间
// ... 其他字段
};
3 ~> 内核管理抽象: ipc _ ids
3.1 核心设计思想
Struct IPC _ ids 是内核管理 IPC 的核心抽象,内部通过 struct IPC _ id _ ary 结构 (包含指针数组) 指向具体的 IPC 资源结构体。
3.2 C 语言面向对象特性运用
- 结构体嵌套: 不同 IPC 资源结构体都以 struct IPC _ perm 开头,确保首地址在数字层面一致,方便统一指针操作
- 多态实现: 通过在子结构体开头嵌入父结构体 (struct ipc _ perm) ,让父类指针可以指向子类对象,结合函数指针,在 c 语言中模拟面向对象的多态特性
4 ~> IPC 资源流转逻辑
4.1 统一管理流程
内核中三类 IPC 资源的管理,本质是通过 IPC _ ids 的统一抽象,结合各自的资源结构体,实现以下完整生命周期:
- 1、资源创建
- 2、权限验证
- 3、资源操作
- 4、资源销毁
4.2 消息队列示例流程
- 消息收发操作
- 将消息链入到等待队列
5 ~> C语言模拟面向对象的经典案例对比

6 ~> 共享内存与文件内存映射
6.1 核心关联结构
共享内存通过 struct shmid _ kernel 管理,内部包含 struct file * file 指针,关联到特殊的文件对象
通过 struct vm _ area _ struct (VMA) 将进程虚拟地址空间和内核的 address _ space (对应物理内存 / 磁盘文件) 做映射
6.2 系统调用流程
共享内存
bash
shmget(创建/获取) → shmat(附加到进程地址空间)
通过 VMA 实现虚拟地址到物理内存的映射。
毫米波
bash
mmap(将磁盘文件映射到进程虚拟地址空间)
内核为文件创建结构文件和地址空间,再通过 VMA 关联进程地址空间。
6.3 核心设计思想
- 统一抽象: 无论是共享内存还是普通文件,都通过 struct file 和 VMA 机制与进程地址空间关联,复用 VFS 的管理逻辑
- 性能优化: 映射后进程可以直接用虚拟地址访问,避免频繁的读写系统调用
- 共享协同:共享内存通过 key 标识同一内存区域;文件映射可用于文件共享或高效 I/O
7 ~> 命令行工具:ipcs
7.1 查看共享内存
bash
ipcs -m
输出字段: key、 shmid、 owner、 bytes、 nattach、 status
7.2 查看消息队列
bash
ipcs -q
输出字段: key、 msqid、 owner、 used-bytes、 messages
7.3 查看信号量
bash
ipcs -s
输出字段: key、 semid、 owner、 nsems
7.4 查看所有 IPC 资源
bash
ipcs -a
结尾
uu们,本文的内容到这里就全部结束了,艾莉丝在这里再次感谢您的阅读!
结语:希望对学习Linux相关内容的uu有所帮助,不要忘记给博主"一键四连"哦!
往期回顾:
🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡 ૮₍ ˶ ˊ ᴥ ˋ˶₎ა
