电脑技术学习

使用 UNIX System V IPC 机制共享应用程序数据

dn001

  引言

  Unix 内核管理的进程自主地操作,从而产生更稳定的系统。然而,每个开发人员最终都会遇到这样的情况,即其中一组进程需要与另一组进程通信,也许是为了交换数据或发送命令。这种通信称为进程间通信(Inter-Process Communication,IPC)。System V (SysV) UNIX 规范描述了以下三种 IPC 机制,它们统称为 SysV IPC:

  消息队列

  信号量

  共享内存

  此外,进程还可以通过其他机制通信,例如:

  读、写和锁定文件

  信号

  套接字

  管道

  FIFO(先进先出)

  这后一组机制一般也称为 IPC。由于其简单性和有效性,本文将集中于 SysV IPC 方法。

  了解 SysV 模型

  三种 SysV IPC 方法具有类似的语法,尽管它们具有不同的用途。一般情况下,它们执行以下操作:

  确定要用于 ftok(3) 的正确 IPC 密钥。

  分别使用 msgget(2)、semget(2) 或 shmget(2) 获得用于消息队列、信号量或共享内存的特定于 IPC 的标识符,这些标识符与 IPC 密钥相关联。

  使用 msgctl(2)、semctl(2) 或 shmctl(2) 修改 IPC 实例的属性。

  利用特定的 IPC 实例。

  最后,使用 msgctl(2)、semctl(2) 或 shmctl(2) 和 IPC_RMID 标志销毁 IPC 实例。

  每个 IPC 实例都被赋予一个标识符,以将它与系统上存在的其他 IPC 实例区分开来。例如,两个不同的应用程序可能分别决定使用共享内存段,因此系统范围的 IPC ID 将区分这两个实例。虽然可能不是那么明显,但是第一个挑战就是弄清如何分发这样的信息:即如何在没有准备某种 IPC 机制的情况下附加到一个公共 IPC 实例。

  ftok 库调用使用某个给定文件中的索引节点信息和一个唯一标识符来得出一个密钥,只要该文件存在并且该标识符为常量,此密钥就保持相同。因此,两个进程可以使用它们的配置文件和编译时常量来得出相同的 IPC 密钥。常量的存在允许同一个应用程序通过改变常量来创建 IPC 机制的多个实例。

标签: