查看消息队列:ipcs -q
删除消息队列:ipcrm -q 消息队列ID
特点:通信双方可以通过消息类型选择性的接收消息
创建消息队列
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
返回:成功 消息队列的ID 失败 -1
参数:
key:函数ftok的返回值或IPC_PRIVATE,也可以随便放数字。
msgflag:IPC_CREAT:创建新的消息队列。
IPC_EXCL:与IPC_CREAT一同使用(用 ‘|’ 连接),表示如果要创建的消息队列已经存在,则返回错误。
IPC_NOWAIT:读写消息队列要求无法满足时,不阻塞。
**注意:**使用或设置消息队列文件权限
消息发送
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
返回:成功 0 失败 -1
参数:
msqid:消息队列的ID
msgp:发送的结构体指针
msgsz:发送的大小
msgflg:标志位,一般是0
发送的信息需要打包成结构体,必须有如下两个成员:
struct msgbuf {
long mtype; // 消息的类型,别设置成0!!!!!
char mtext[10]; // 真实消息内容
};
消息接收
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
返回:成功 接收的字节数 失败 -1
参数:
msqid:消息队列的ID
msgp:接收保存消息的结构体指针(同上面消息发送的结构体)
msgsz:接收的大小
msgtype(重点):接收消息的类型,结构体内的long数据
msgflg:标志位,可以是0(忽略)。
IPC_NOWAIT,如果消息队列为空,则返回一个ENOMSG,并将控制权交回调用函数的进程。如果不 指定这个参数,那么进程将被阻塞直到函数可以从队列中得到符合条件的消息为止。
MSG_NOERROR,如果函数取得的消息长度大于msgsz,将只返回msgsz 长度的信息,剩下的部分被 丢弃了。如果不指定这个参数,E2BIG 错误将被返回,而消息则留在队列中不被取出。
如果接收消息类型不存在,就会造成程序阻塞
如果同一个类型有多个消息,接收按照发送顺序接收
删除消息队列
其实它不是完全用于删除,操作与输入参数cmd有关
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
返回:成功0 失败 -1
参数:
msqid:消息队列ID
cmd:IPC_STAT:读取消息队列的数据结构msqid_ds,并将其存储在 buf 指定的地址中。
IPC_SET:设置消息队列的数据结构msqid_ds中的ipc_perm元素的值。这个值取自buf参数。
IPC_RMID:从系统内核中移走消息队列。
buf:存放读取/设置 消息队列属性 的结构体,如果是删除/移走 可以是null