消息队列通讯

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

原文地址:https://www.cnblogs.com/gary-guo/p/5579457.html