消息队列

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创建两个进程,父进程放消息,子进程接收消息




运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值