进程通信方式----消息队列
消息队列就是一个消息的链表,可以把消息看作一个记录,具有特定的格式及特定的优先级。对消息队列有写权限的进程可以向中按照一定的规则添加新消息,对消息队列有读权限的进程可以从中读走消息。
消息队列是随内核持续,只有在内核重启或者显示删除一个队列时,该消息队列才会真正被删除。
消息队列的结构:
队列头:struct msg_queue来描述,该结构体中包含消息队列的大量消息,包括:消息队列键值,用户ID,组ID,消息队列中消息数目等。
有图可知:
全局结构:structipc_ids msg_ids可以访问每个消息队列列头的第一个成员structkern_ipc_perm.
struct kern_ipc_perm.能够与具体的消息队列对应起来,是因为在该结构体中,有一个
key_t类型成员key,而key则是唯一确定一个消息队列。
使用消息队列的三个操作
1, 打开或创建消息队列,消息队列描述字是由系统范围内唯一的键值生成的,而键值可以看作对应系统内的一条路径。
2, 读写操作,每个消息由如下的结构
Struct msgbuf
{
Long mtype;
Char mtext[1];
}
Mtype成员代表消息类型,
Mtext 消息内容
注意点:对于发消息和读消息来说,首先预置一个msgbuf缓冲区并写入和读出消息类型和消息内容。
3, 获得或设置消息队列属性,分配一个类似消息队列的结构,来返回消息队列的属性。
消息队列操作函数
1, msgget
函数作用:创建消息队列
函数原型:int ,msgget(key_t key,intmsgflg)
函数参数:key:键值,可有fork()函数获得,
msgflg:IPC_CREAT,IPC_EXCL,IPC_NOWAIT.
函数的使用:
如果消息队列的键值没有,并且msgflg中包含了IPC_CREAT标志位。
Key设置为IPC_PRIVATE
头文件:#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
函数返回值:成功:消息队列描述字,失败:-1
2, msgrcv
函数作用:读出消息队列的数据
函数原型:int msgrcv(int msgid,struct*msgp,int msgsz,long msgtyp,int msgflg)
函数参数:msgid:消息队列描述字。
Msgp:储存信息
Msgsz:消息内容的长度
Msgtyp:消息的类型
Msgflg:读消息标志,
头文件:#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
返回值:成功:消息的实际字节数,失败:-1
3, msgsnd
函数作用:往消息队列里写入数据
函数原型:int msgsnd(int msgid,strcutmsgbuf *msgp,int msgsz,int msgflg)
头文件:#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
返回值:成功:0,失败:-1
4, msgctl
函数作用:删除消息队列
函数原型:int msgctl(int msgid,intcmd,struct msqid_ds *buf)
函数参数:cmd:IPC_RMID,删除msqid标识的消息队列
头文件:#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
返回值:成功,0,失败-1.
消息队列发送端
消息队列接收端
截图:
相互通信:
Msg1.c
Msg2.c
结果: