【Linux:文件 + 进程】理解IPC通信

🎬 个人主页艾莉丝努力练剑
专栏传送门 :《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有所帮助,不要忘记给博主"一键四连"哦!

往期回顾

【Linux:文件】进程间通信进阶(2)

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡 ૮₍ ˶ ˊ ᴥ ˋ˶₎ა

相关推荐
sdszoe49222 小时前
OSPF多区域基础实验1
网络·华为·ospf多区域实验
开开心心就好2 小时前
安卓免费证件照制作软件,无广告弹窗
linux·运维·安全·pdf·迭代器模式·依赖倒置原则·1024程序员节
洋不写bug2 小时前
Java线程(二):线程特点、状态、终止开始控制(
java·开发语言
ZTLJQ2 小时前
挖掘金矿:Python数据解析库完全解析
开发语言·python
辉视广播对讲2 小时前
私有协议 IP 广播对讲 vs SIP 广播对讲多维度对比分析报告
网络·网络协议·tcp/ip
魑-魅-魍-魉2 小时前
Stream 中 reversed () 引发 IDE 方法标红的排查方案
ide
山上三树2 小时前
C++ 回调函数(Callback Function)详解
开发语言·c++
猿来如此呀2 小时前
Linux 常用命令选项与对应英文单词对照表
linux·运维·服务器
wanhengidc2 小时前
高防IP的主要功能有哪些?
运维·服务器·网络·网络协议·tcp/ip·游戏