System V IPC:
Unix系统存在信号、管道等基本的进程间的通信机制;
System V引入了三种高级的进程通信机制:
消息队列、共享内存、信号量
IPC对象(消息队列、共享内存、信号量)存在于内核中而不是文件系统中(虽然管道也是在内核中,但是它的释放由内核控制),由用户控制释放(即用户管理IPC对象的生命周 期),不像管道由内核控制。
IPC对象通过其标识符来引用和访问,所有的IPC对象在内核中有唯一的标识ID,在用户空间有唯一的标识key
linux IPC继承System V
IPC对象是全局对象(即如果不手动的去释放将一直在内核中);
可用ipcs、ipcrm等命令查看或删除
每个IPC对象都有get函数创建
msgget(消息队列)、shmget(共享内存)、semget(信号量)
get函数中的参数要指定唯一的标识key
IPC对象的权限和所有者结构体
消息队列
消息队列是内核中的一个链表(一个消息队列中可以有多个消息,每个消息都有类型(mtype));
允许一个或多个进程往消息队列中写消息,但一个消息只能被一个进程读取,这个消息在读取完后就自动删除;
每一个消息队列在内核中用一个唯一的IPC标识ID表示;
消息队列的属性:
消息队列的打开和创建:
int msgget(key_t key,int flag)
成功返回内核中消息队列的标识ID,失败返回-1
参数:
key:用户空间的唯一标识key;
flag:IPC_CREAT_IPC_EXCL等
若要创建消息队列,key可指定键值,也可将之设为IPC_PRIVATE。若打开进行查询,key必须为一个非零的值,否则是查询不到的
消息队列的控制:
int msgctl(int msgqid,int cmd,struct msqid_ds *buf)
成功返回0,失败返回-1
参数:
msgid:消息队列id
buf:消息队列属性指针
cmd:
消息发送到消息队列:
ssize_t msgsnd(int msgqid,const void *ptr,size_t nbytes,int flag)
成功返回0,失败-1
参数:
msgqid:消息队列id
ptr:
struct mymesg{
long mtype;//消息的类型,是一个整数且大于0
char mtex[512];//消息数据本身,是第三个参数的内容
}
nbytes:消息的大小,不包括mtype的长度
flag:
0:阻塞(消息队列中装满消息);
IPC_NOWAIT:类似文件IO的非阻塞io标志;
如果指定为IPC_NOWAIT,当队列已满,msgsnd立即出错返回EAGAIN;
如果指定为0,调用msgsnd的进程阻塞直到有空间可以容纳要发送的消息,或则删除这个消息队列,或则这个进程捕捉到一个信号,并从信号处理函数返回
从消息队列中接受消息:
ssize_t msgrcv(int msgqid,void *ptr,size_t nbytes,long type,int flag)
成功返回消息的数据部分长度,失败-1
参数:
msgqid:消息队列id
ptr:指向存放消息的指针
nbytes:消息缓存的大小,不包括吧mtype的大小。nbytes=sizeif(struct mymesg)-sizeof(long)
type:消息类型
flag:0或IPC_NOWAIT
标签:IPC,队列,int,消息,key,内核 From: https://www.cnblogs.com/zj-studyrecoding/p/17181818.html