Linux17 进程间通信(二) 消息队列

每个进程有4G的虚拟地址空间,3G的用户空间是每个进程独有的,1G的内核空间是共享的

内核对象:内核里面的一个结构体变量。标识符和键都能唯一的标识一个对象。标识符是内核中对象的标识,键是用户层次对内核中对象的标识,两个进程需要访问同一个内核对象,必须给一个相同的key值。我们通过键值来找到内核对象的标识符。

(一)消息:

类型+数据。(一种简单的协议)消息是一条一条的,读取的时候一次只能读一条一条的,而管道是流式的。消息的方式是数据报类型的,管道是字节流的。

(二)消息队列:消息+先进先出。

在同一类型上符合先进先出的规定,对于整个消息队列,类优先级。

A进程只读1   B进程只读2

A读1是先进先出

(三)消息队列的使用:

1、创建或者获取消息队列int msgget(int key,int flag);

key:键值,flag:权限和控制位。IPC_CREAT|0664

成功返回内核对象的标识符,失败返回-1

2、发送消息:int  msgsnd(int msgid.void* ptr,int datalen,int flag);

msgid:标识符

struct data

{

  long  type;

char  text[128];//数据部分的有效长度

}

ptr:指向的数据类型包含一个long的类型字段,一个数据字段。

datalen:数据长度

flag:控制标记,默认为0,IPC_NOWAIT,一般情况用默认就ok

3、接收消息:int  msgrcv(int msgid.void* ptr,int size,long type,int flag);

msgid:标识符

ptr:读取后存放的位置

type:读取的消息类型

size;数据大小

flag:控制标记,默认为0,IPC_NOWAIT,一般情况用默认就ok

4、删除内核对象IPC结构

int msgctl(int msgid,int cmd,struct msgid_ds* buff);

ctl是一个设置函数

cmd:对msgid指定的队列要执行的命令。IPC­_STAT,IPC_SET,IPC_RMID

ipcs -q 查看消息队列

ipcrm -q msgid 删除消息队列

代码:#include<sys/msg.h>

发消息

收消息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值