每个进程有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>
发消息
收消息