1.消息队列简述
消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法
这个被发送的数据块被认为都有一个类型,所以进行接收的进程收到的这个数据块可以有不同的类型
消息队列是进程间通信的一种方法,管道也是进程间通信的一种方法,所以消息队列和管道一样也有不足,就是每个消息队列的最大长度是有上限的,每个消息队列的字节数也是有上限的,系统中的消息队列总数也是有一个上限。
2.消息队列结构
在内核里面,会为每个IPC对象维护一个数据结构,而消息队列里面了解第一个的意思即可
struct ipc_perm{
key_t _key;//代表某个ipc,相当于文件的文件名
}
3.消息队列函数
msgget函数
创建消息队列
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, //相当于文件名
int flag); //打开消息队 //创建:IPC_CREAT | 0644
返回值:代表这个已经被打开的消息队列,打开的消息队列相当于文件描述符
msgsnd函数
往消息队列中放数据
struct msgbuf{
long channel; //第一个必须是long类型
char text[1024];};
int msgsnd(int msgid,
const void *msgp, //要发送给消息队列的数据在哪里
size_t msgsz, //数据的大小,不包含channel
int msgflg);//0
msgrcv函数
ssize_t msgrcv(int msgid,
void *msgp, //准备接受数据的地方
size_t msgsz, //装数据的地方大小,不包括channel
long msgtyp, //类信号
int msgflg); //0
msgctl函数
消息队列的控制函数
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
参数
msqid:由msgget函数返回的消息队列标识码
cmd: 是将要采取的动作(有三个可取值)
返回值:成功返回0,失败返回-1
删除消息队列
ipcrm -Q key
4.代码示例
先来测一下往消息队列中放数据
a.
该代码的功能是先创建了一个消息队列,ID为1,然后往消息队列中放数据
运行结果:
b.该段代码是用fork创建两个进程,父进程放消息,子进程接收消息
运行结果: