获取键值
key_t ftok(char *pathname, char proj)
头文件为”sys/ipc.h”。返回文件名对应的键值,失败返回 -1。proj是消息队列名字,不能为空。fname是指定的文件名(已经存在的文件名)。需要有-t 的权限,或用root权限执行,通常设为/tmp。
创建/打开消息队列
int msgget(key_t key, int msgflg)
头文件为sys/msg.h。key由ftok获得。
msgflg有:
IPC_CREAT 创建新的消息队列,应配有文件权限0666。
IPC_EXCL 与IPC_CREAT一同使用,表示如果要创建的消息队列已经存在,则返回错误。
IPC_NOWAIT 读写消息不阻塞。
当没有与key相对应的消息队列并且msgflg中包含了IPC_CREAT标志 或 key的参数为IPC_PRIVATE 时,创建一个新的消息队列。
发送消息
int msgsnd(int msqid, struct msgbuf *msgp, int msgsz, int msgflg)
向消息队列发送一条消息。参数msqid为消息队列的id,msgp为存放消息的结构体。msgsz是消息的长度,和数组的大小不一样哦。msgflg为消息标志,通常为0,也可以为IPC_NOWAIT。出错返回 -1。
消息格式
struct msgbuf {
long mtype;
char mtext[100];
};
接收消息
int msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg)
参数msqid代表的消息队列中读取一个msgtyp类型的消息,并把消息存储在msgp指定的msgbuf结构中。读取后队列中的消息将会删除。size为结构体中数据的大小,不要计算msgtyp。出错返回 -1。
设置消息队列属性
int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );
参数:msgctl 系统调用对 msgqid 标识的消息队列执行 cmd 操作,系统定义了 3 种 cmd 操作: IPC_STAT , IPC_SET , IPC_RMID
IPC_STAT : 该命令用来获取消息队列对应的 msqid_ds 数据结构,并将其保存到 buf 指定的地址空间。
IPC_SET : 该命令用来设置消息队列的属性,要设置的属性存储在buf中。
IPC_RMID : 从内核中删除 msqid 标识的消息队列。