电脑技术学习

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

dn001

  然后 mq_clIEnt.c 调用 msgrcv 以从队列提取消息。前三个参数指定消息队列标识符、指向将包含消息的内存空间的指针和缓冲区的大小。第四个参数是类型参数,它允许您选择所要获得的消息:

  如果类型为 0,则返回队列中的第一个消息。

  如果类型为正整数,则返回队列中的第一个该类型的消息。

  如果类型为负整数,则返回队列中具有最小值的第一个消息,且该最小值小于或等于指定类型的绝对值。例如,如果要将 2 然后再将 1 添加到队列,则使用类型 -2 调用 msgrcv 将返回 1,因为它最小,尽管它是队列中的第二个消息。

  传递给 msgrcv 的第五个参数同样是阻塞标志。清单 4 显示了实际操作中的客户端和服务器。

  清单 4. 客户端和服务器代码的输出

sunbox$ ./mq_server
My key is 704654099
Message identifier is 2
sunbox$ ./mq_client
My key is 704654099
Message identifier is 2
Hello, world! (104)

  客户端和服务器的输出表明,它们得出了相同的 IPC 密钥,因为它们都引用同一个文件和标识符。服务器创建了 IPC 实例,内核为该实例分配了值 2,并且客户端应用程序知道这一点。这样,客户端从消息队列提取回“Hello, world!就没什么奇怪的了。

  此示例显示了最简单的情况。消息队列对于短期进程是有用的,例如将工作提交给重负荷后端应用程序(例如某个批处理应用程序)的 Web 事务。客户端也可以是服务器,并且多个应用程序可以向队列提交消息。消息类型字段允许应用程序将消息发送给特定的读取器。

  使用信号量锁定资源

  进程之间的通信不需要涉及到发送大量的数据。实际上,单个位可能就足以指示某个进程在使用某个资源。请考虑两个需要访问某个硬件部分的进程,但是一次只有一个进程能够使用该硬件。每个进程就包含引用计数器的点达成一致。如果一个进程读取该计数器并看到其值为 1,则它就知道另一个进程正在使用该硬件。如果该计数器的值为 0,则该进程就可以自由使用该硬件资源,前提是在该硬件操作期间将计数器设置为 1 并在结束操作时将其重置为 0。

标签: