消息队列通讯
1、基本概念
消息队列就是一个消息的链表。而一条消息则可看作一个记录,具有特定的格式。进程可以向其中按照一定的规则添加新消息;另一些进程则可以从消息队列中读走消息。也是作为IPC进程通信之一。
2、函数学习
1)创建或打开消息队列
函数名:msgget
函数原型:Int msgget(key_t key,int msgflg);
函数功能:打开或创建消息队列
所属头文件:<sys/ipc.h>、<sys/msg.h>、<sys/types.h>
返回值:成功:返回消息队列的id,失败:返回-1
参数说明:Key:消息队列的键值;Msgflg:打开标志,重要的标志IPC_CREAT:表明新创建一个消息队列
2)发送数据
函数名:Msgsnd
函数原型:Int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgflg);
函数功能:用于发送消息到消息队列
所属头文件:<sys/ipc.h>、<sys/msg.h>、<sys/types.h>
返回值:成功:返回0;失败:返回-1
参数说明:Msqid:消息队列的id;Msgp:指向要发送的消息。;Msgsz:消息的长度;Msgflg:标志
消息结构:struct msgbuf{long mtype;//消息类型 char mtex[1];//消息数据}
3)从消息队列中读出消息
函数名:Msgrcv
函数原型:Ssize_t msgrcv(int msgid,void *msgp,size_t msgsz,long msgtyp,int msgflg);
函数功能:从消息队列中接收消息
所属头文件:<sys/ipc.h>、<sys/msg.h>、<sys/types.h>
返回值:成功:返回实际接收到的消息的数据长度;失败:返回-1
参数说明:Msqid:消息队列的id;Msgp:存放取出的消息;Msgsz:希望取到消息的最大长度
Msgtyp:消息的类型。等于0:直接忽略类型,取消息队列中的第一条消息。大于0:取消息队列中类型等于msgtyp的第一条消息。小于0:取类型比msgtyp的绝对值要小或者等于的消息,如果说有多条消息满足该条件,则取类型最小的一条。
Msgflg:标志
4)删除消息队列
函数原型:Int msgctl(int msgid,int cmd,struct msqid_ds *buf);
函数功能:控制消息队列
所属头文件:<sys/ipc.h>、<sys/msg.h>、<sys/types.h>
返回值:成功:返回0;失败:返回-1
参数说明:Msqid:消息队列的id;Cmd:对消息队列要执行的操作命令。IPC_RMID为删除消息队列。Buf:获取内核中的msgid_ds结构,通常不用。
A进程
1、从键盘获取一字符串;2、构造一则消息,放入消息队列
B进程
1、把消息队列中消息取出来;2、并打印消息。
A进程工作:1、创建消息队列;2、循环:2.1获取键盘输入包括:消息类型、消息里数据;2.2构造成消息发送到消息队列。3、删除消息队列。
B进程接收程序工作:1、打开消息队列;2、接收消息队列中的消息;3、打印消息列队中的数据;4、交给多个子进程来处理。
send.c
receive.c