进程间通信——消息队列

来源:互联网 发布:手绘视频软件对比 编辑:程序博客网 时间:2024/06/07 13:24

1、什么是消息队列?

消息队列是消息的链接表,存放在内核中并由消息队列标识符标识。
消息队列可让不相关的进程进行通信。

2、消息队列操作

(1)打开/创建

int msgget((key_t)  key,int flag);

flag: 权限标志,标示消息队列的访问权限。flag与IPC_CREAT做按位或操作,表示当key所命名的消息队列不存在时创建一个消息队列;若存在,IPC_CREAT被忽略。

(2)控制消息队列

int msgctl(int msqid,int cmd,struct msqid_ds *buf);

msqid: 由msgget返回的消息队列标识符。

cmd: 由msqid指定队列要执行的命令,可取的值有三个。

(a)IPC_STAT:把msqid_ds结构中的数据设置成消息队列的当前关联值。
(b)IPC_SET:如果进程有足够的权限,就会将消息队列的当前关联值设置为msqid_ds结构中给出的值。
(c)IPC_RMID:删除消息队列。

buf:指向msgid_ds结构的指针,它指向消息队列模式和访问权限的结构。

(3)将消息放到消息队列中(消息总是放在队列尾端)

int msgsnd(int msqid,const void *msg_ptr,size_t  msg_sz,int  flag);

msqid: 由msgget返回的消息队列标识符。
msg_ptr: 指向准备发送消息的指针,消息必须以一个长整型成员变量开始。
msg_sz: msg_ptr指向的消息的长度。这个长度不包括长整型消息类型成员变量的长度。
flag: 控制在当前消息队列满或队列消息达到系统范围的限制时将要发生的事情。

(4)从消息队列中获取消息

int msgrcv(int msqid,void *msg_ptr,size_t  msg_sz,long int msgtype,int  flag);

msqid: 由msgget返回的消息队列标识符。
msg_ptr: 指向准备发送消息的指针,消息必须以一个长整型成员变量开始。
msg_sz: msg_ptr指向的消息的长度。这个长度不包括长整型消息类型成员变量的长度。
msgtype: 实现一种简单形式的接收优先级,msgtype=0,就获取队列中的第一个可用消息;msgtype>0,获取具有相同消息类型的第一个消息;msgtype<0,获取消息类型等于或小于msgtype的绝对值的第一个消息。
flag: 控制在当前消息队列满或队列消息达到系统范围的限制时将要发生的事情。

关于函数的实现,后期会专门更一篇博客。