7.3 System V IPC机制

为了提供与其它系统的兼容性,Linux也支持三种system Ⅴ的进程间通信机制:消息、信号量(semaphores)和共享内存,Linux对这些机制的实施大同小异。我们把信号量、消息和共享内存统称System V IPC对象,每一个对象都具有同样类型的接口,即系统调用。就像每个文件都有一个打开文件号一样,每个对象也都有唯一的识别号,进程可以通过系统调用传递的识别号来存取这些对象,与文件的存取一样,对这些对象的存取也要验证存取权限,System V IPC可以通过系统调用对对象的创建者设置这些对象的存取权限。

Linux内核中,System V IPC的所有对象有一个公共的数据结构pc_perm结构,它是IPC对象的权限描述,在linux/ipc.h中定义如下:

 

struct ipc_perm

{

   key_t  key;   /* */

   ushort uid;    /* 对象拥有者对应进程的有效用户识别号和有效组识别号 */

   ushort gid;  

  ushort cuid;    /* 对象创建者对应进程的有效用户识别号和有效组识别号 */

   ushort cgid;

   ushort mode;   /*  存取模式 */

   ushort seq;     /* 序列号 */

};

 

在这个结构中,要进一步说明的是(key)。键和识别号指的是不同的东西。系统支持两种键:公有和私有。如果键是公有的,则系统中所有的进程通过权限检查后,均可以找到System V IPC 对象的识别号。如果键是公有的,则键值0,说明每个进程都可以用键值0建立一个专供其私用的对象。注意,对System V IPC对象的引用是通过识别号而不是通过键,从后面的系统调用中可了解这一点。