将消息发送到队列是非常简单的。在对消息中的内存空间清零之后,将一个熟悉的字符串复制到缓冲区的文本部分。将消息类型设置为 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 标志,以便其中首先启动的应用程序创建队列。
标签: