电脑技术学习

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

dn001

  在一组进程独立得出各自的 IPC 密钥之后,它们必须使用某个 get 系统调用来获得与该特定 IPC 实例关联的特定标识符。各个 get 调用全都需要 IPC 密钥和一组标志,以及一些信号量和共享内存大小信息。由于 Unix 是多用户系统,标志将包括熟悉的八进制形式的文件权限(因此 666 意味着任何人都可以执行读和写)。如果还设置了 IPC_CREAT 标志,则会在 IPC 实例不存在时创建该实例。如果没有设置 IPC_CREAT 标志并且还未创建 IPC 实例,则 get 调用将返回错误。

  对于能够自己分发 IPC 实例标识符的应用程序,存在一种用于执行该任务的更简单方法。如果您在调用 get 以创建 IPC 时使用密钥 IPC_PRIVATE,则实例标识符将是唯一的。需要附加到该 IPC 的其他进程不需要调用 get,因为它们已经拥有该标识符。

  一旦拥有了标识符,应用程序就可以任意使用 IPC 实例。每种 IPC 方法都是不同的,并在它们各自的部分中进行处理。

  通过队列传递消息

  消息队列提供了一种机制,使得一个进程可以发送另一个进程能够获得的消息。在获得该消息之后,将从队列中删除该消息。消息队列非常独特,因为两个进程不必同时存在——一个进程可以发送一个消息并退出,而该消息可以在数天后才被另一个进程获得。

  消息必须由一个长整数后面跟着消息数据组成。清单 1 显示了 C 语言中的这样一个结构,其中使用了一个 100 字节的消息。

  清单 1. 示例消息的 C 语言定义

struct mq_message {
  long type; /* The type or destination */
  char text[100]; /* Data */
};

  消息接收者使用消息类型。当从队列轮询消息时,您可以选择第一个可用的消息,或者可以查找某种特定的消息类型。将要使用的消息类型特定于应用程序,从而使得队列独特于其他形式的 IPC,因为内核通过读取 type 字段,从而在一定程度上了解所传递的应用程序数据。

标签: