消息队列
<多进程通信>
1.概念:提供一种在两个不相关的进程之间传递数据简单而有效的方法,与有名管道类似,但优势在于它独立于发送和接收进程而存在,这消除了在同步命名管道的打开和关闭时可能产生的一些困难。
消息队列的特点:发送数据,数据具有类型。消息存储在一个优先级队列中,读端可以根据消息类型按照先进先出的原则读取特定的数据
2. 相关函数
#include<sys/msg.h>
(1) int msgget(key_t key,int msgflg);//创建和访问一个消息队列。成功返回一个标识符,失败返回-1;
Msgflg<权限及控制>:ey:msgget(key_t(1234), 0664 | IPC_CREAT)
IPC_CREAT:不存在则创建,存在则直接获取
IPC_EXCL:不存在则创建,存在则出错
(2)Int msgsnd(int msqid,const void *msg_ptr,size_t msg_sz,int msgflg)//用来把消息添加到消息队列中
Msqid:消息队列的标识符
Msg_ptr:一个指向准备发送消息的指针(指的写的是什么类型+数据)
注有两个约束条件:
(1)它的长度必须系统规定的上限
(2)以一个长整型成员变量开始
一般定义为:struct my_message{
Long int message_type;
}
Msg_sz:指消息/数据的长度,此长度不能包括长整型消息类型成员变量的长度
Msgflg:控制当前消息队列满或队列消息到达系统范围的限制时将要发生的事情,注如果msgflg设置了IPC_NOWAIT标志,函数将立刻返回,不发送消息并且返回值为-1,如果msgflg中的IPC_NOWAIT标志没有被设置,则发送进程将挂起以等待队列中腾出可用空间
(3)int msgrcv(int msqid,void *msg_ptr,size_t msg_sz,lomg int msgtype,int msgflg);//从消息队列中获取信息,成功返回放到接收缓存区中的字节数,失败返回-1
Msqid:消息队列的标识符
Msg_ptr:一个指向准备接收消息的指针,此处类似于一个char *的buf
Msg_sz:指向消息的长度,此长度不能包括长整型消息类型成员变量的长度
Msgtype:接受优先级,为0就获取队列中第一个可用消息,大于0就获取具有相同消息类型的第一个消息,小于0,绝对值得第一个消息
Msgflg:用于控制当队列中没有相应类型的消息可以接收时将发生的事情,如果设置了IPC_NOWAIT标志,函数将立刻返回,并且返回值为-1,如果msgflg中的IPC_NOWAIT标志被清除,则进程将会挂起以等待一条相应类型的消息到达
(4)int msgctl(int msqid,int command,struct msqid_ds *buf);
//成功返回0,失败返回-1,参数含义与共享内存shmctl函数参数含义相同
Command(采取的动作):IPC_STAT:把msqid_ds结构中的数据设置为消息队列的当前关联值。,IPC_SET:如果进程有足够的权限,就把消息队列的当前关联值设置为msqid_ds结构中给出的值。IPC_RMID:删除消息队列。
巩固的练习:A进程根据用户输入选择的类型(long)发送用户输入的数据(char*)
B进程读取1000类型的数据
C 进程读取2000类型的数据
代码及结果:望有不同见解的进行交流