《应用编程 — 进程间通信 — 消息队列消息队列》

1.消息队列

  消息队列:提供一种从一个进程向另一个进程发送一个数据块的方法。与FIFO相比,消息队列的优势在于,它独立于发送和接收进程而存在。 

  1.链表式结构组织,存放于内核。

  2.通过队列标识来引用。

  3.通过一个数据类型来索引指定的数据。

2.msgget函数

#include <sys/msg.h>

int msgget(key_t key, int msgflg);
第一个参数key:每一个IPC对象与一个key对应
第二个参数msgflg:函数的行为(0666|IPC_CREAT表示用户具有读写权限)
返回值: 成功:非负队列ID; 失败:-1

  作用 :创建和打开一个消息队列。

  可通过ipcs -q(只查看消息队列的状态):查看系统的IPC状态

3.msgsnd函数

#include<sys/msg.h>

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

第一个参数msqid是由msgget函数返回的消息队列标识符;
第二个参数msg_ptr是一个指向准备发送消息的指针,消息必须像刚才说的那样以一个长整型成员变量开始;
第三个参数msg_sz是msg_ptr指向的消息的长度。这个长度不能包括长整型消息类型成员变量的长度;
第四个参数msgfig控制在当前消息队列满或队列消息到达系统范围的限制时将要发生的事情,如果msgflg中设置了IPC_NOWAIT标志,函数将立刻返回,不发
送消息并且返回值为-1.如果msgflg中的IPC_NOWAIT标志被清除,则发送进程将挂起以等待队列中腾出可用空间。
返回值: 成功:0; 失败:-1

  作用:把消息添加到消息队列中。

  消息的结构受两方面的约束。首先,它的长度必须小于系统规定的上限;其次,它必须以一个长整型成员变量开始。接收函数将用这个成员变量来确定消息的类型。当使用消息时,最好把消息结构定义为下面这样:

  struct my_message{

    long int message_type;

  }

  由于在消息的接收中要用到message_type,所以你不能忽略它。你必须在声明自己的数据结构时包含它,并且最好将它初始化为一个已知值。

4.msgrcv函数

#include<sys/msg.h>

int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);
第一个参数msqid是由msgget函数返回的消息队列标识符;
第二个参数msg_ptr是一个指向准备接收消息的指针,消息必须像前面msgsnd函数中介绍的那样以一个长整型成员变量开始。
第三个参数msg_sz是msg_ptr指向的消息的长度,它不包括长整型消息类型成员变量的长度。它不包括长整型消息类型成员变量的长度。
第四个参数msgtype是一个长整型,它可以实现一种简单形式的接收优先级。如果msgtype的值为0,就获取队列中的第一个可用消息。
如果它的值大于零,将获取具有相同消息类型的第一个消息。如果它的值小于零,将获取消息类型等于或小于msgtype的绝对值的第一个消息。
这个函数看起来好像很复杂,但实际应用很简单。如果只想按照消息发送的顺序来接收它们,就把msgtype设置为0。如果只想获取某一特定类型的消息,就把msgtype设置
为相应的类型值。如果想接收类型等于或小于n的消息,就把msgtype设置为-n。
第五个参数msgflg用于控制当队列中没有相应类型的消息可以接收时将发生的事情。如果msgflg中的IPC_NOWAIT标志被设置,函数将会立刻返回,返回值是-1.如果msgflg
中的IPC_NOWAIT标志被清除,进程将会挂起以等待一条相应类型的消息到达。

  作用:从一个消息UI列中获取消息。

5.msgctl函数

#include<sys/msg.h>

int msgctl(int msqid, int command, struct msqid_ds *buf);
第一个参数msqid是由msgget返回的消息队列标识符;
第二个参数command是将要采取的动作,它可以取3个值。
IPC_STAT  把msqid_ds结构中的数据设置为消息队列的当前关联值    
IPC_SET    如果进程有足够的权限,就把消息队列的当前关联值设置为msqid_ds结构中给出的值
IPC_RMID  删除消息队列

返回值: 成功:0; 失败:-1

猜你喜欢

转载自www.cnblogs.com/zhuangquan/p/12299590.html