1.获取消息队列
消息队列相关的API都在sys/msg.h库中,要创建消息队列,使用函数msgget();这个函数第一个参数为消息队列ID(此Id是给定主机上唯一的描述符或关键字),第二个参数为识别消息旗标的参数,返回值是一个句柄,和文件描述符相似,指向指定Id的消息队列。
int msgget(key_t key, int msgflg);key_t值必须是一个非零的值或者是特殊符号IPC_PRIVATE。
msgflg允许用户设置两个不同类型的参数:一个指令和一个访问权限设置选项。权限和文件权限类似。指令有三种:
1)IPC_CREAT
2)IPC_CREAT|IPC_EXCL
3)0:告诉msgget消息队列已存在,获取消息队列描述符
key=ftok("/home/queue",0); //保证消息队列id唯一
msgid=msgget(key,IPC_CREAT|0666);
2.配置消息队列
消息大小默认是16kB,可以采用msgctl()函数调整其大小。eg:
struct msqid_ds buf;
msgid=msgget(xxx,0);
msgctl(msgid,XXX,&buf);
msgctl()函数的第二个参数有三种值可以设置:
1)IPC_STAT:读取消息队列当前默认设置
2)IPC_SET :修改消息队列设置
3)IPC_RMID:移除指定的消息队列
注:msgctl()函数可以获取消息队列信息、设置消息队列信息和移除消息队列
3.向消息队列写入消息
消息通过消息队列发送,消息队列上下文环境对消息只有一个限制,即要发送的消息对象必须在它的开头有一个long类型的变量,用于定义消息的类型。通过msgsnd()函数来向消息队列写消息。
4.从消息队列读取消息
首先通过msgget()函数获取消息队列Id,然后通过msgrcv()函数从消息队列读取消息。
5.移除消息队列
使用msgctl()函数和参数IPC_RMID来移除。
msgid=msgget(xxx,0);
msgctl(msgid,IPC_RMID,NULL);