电脑技术学习

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

dn001

  将消息发送到队列是非常简单的。在对消息中的内存空间清零之后,将一个熟悉的字符串复制到缓冲区的文本部分。将消息类型设置为 1,然后调用 msgsnd。msgsnd 预期接受的参数为队列 ID、一个指向数据的指针和数据的大小,以及一个指示是否阻塞该调用的标志。如果该标志为 IPC_NOWAIT,则即使队列已满,该调用也会返回。如果该标志为 0,则调用将阻塞,直至队列上的空间被释放、队列被删除或应用程序收到某个信号。

  该过程的客户端行为与此类似。清单 3 显示了检索服务器发送的消息的代码。

  清单 3. 用于从队列检索消息的代码

#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#include <string.h>
#include <stdio.h>
int main (void) {
    key_t ipckey;
    int mq_id;
    struct { long type; char text[100]; } mymsg;
    int received;
    /* Generate the ipc key */
    ipckey = ftok("/tmp/foo", 42);
    printf("My key is %dn", ipckey);
    /* Set up the message queue */
    mq_id = msgget(ipckey, 0);
    printf("Message identifIEr is %dn", mq_id);
    received = msgrcv(mq_id, &mymsg, sizeof(mymsg), 0, 0);
    printf("%s (%d)n", mymsg.text, received);
}

  获得 IPC 密钥和消息队列标识符的过程与服务器的代码类似。对 msgget 的调用不指定任何标志,因为服务器已经创建了队列。如果应用程序的设计允许客户端在服务器之前启动,则客户端和服务器都必须指定权限和 IPC_CREAT 标志,以便其中首先启动的应用程序创建队列。

标签: