消息队列、共享内存、信号量的机制:它们在使用之前都要生成 key,然后通过 key 得到唯一的 id,并且都是通过 xxxget 函数。在内核里面,这三种进程间通信机制是使用统一的机制管理起来的,都叫 ipcxxx。为了维护这三种进程间通信进制,在内核里面,我们声明了一个有三项的数组。
通过这段代码,来具体看一看。
- struct ipc_namespace {
- ......
- struct ipc_ids ids[3];
- ......
- }
-
- #define IPC_SEM_IDS 0
- #define IPC_MSG_IDS 1
- #define IPC_SHM_IDS 2
-
- #define sem_ids(ns) ((ns)->ids[IPC_SEM_IDS])
- #define msg_ids(ns) ((ns)->ids[IPC_MSG_IDS])
- #define shm_ids(ns) ((ns)->ids[IPC_SHM_IDS])
根据代码中的定义,第 0 项用于信号量,第 1 项用于消息队列,第 2 项用于共享内存,分别可以通过 sem_ids、msg_ids、shm_ids 来访问。
这段代码里面有 ns,全称叫 namespace。可能不容易理解,你现在可以将它认为是将一台 Linux 服务器逻辑的隔离为多台 Linux 服务器的机制,它背后的原理是一个相当大的话题,我们需要在容器那一章详细讲述。现在,你就可以简单的认为没有 namespace,整个 Linux 在一个 namespace 下面,那这些 ids 也是整个 Linux 只有一份。
共享内存的创建和映射过程。

此文章为11月Day21学习笔记,内容来源于极客时间《趣谈Linux操作系统》,推荐该课程。