消息队列
我们可以把消息队列理解为共享的消息链表,它存储在内核中,由消息队列标识符标识。消息队列传输数据的单位是有类型的数据块,这点与管道不同,管道的信息传输是基于字节流。
不同进程发送的数据块可被认为都有自己的类型,而接受端进程接受的数据块可以有不同的类型。
消息队列与管道相同的地方在于他们都是有限的。及既然他们都是一块共享的内存,那么他们必定有大小。
- msgmax,每个消息的最大长度是有上限的。
- msgmnb,每个消息队列的最大字节数也是有上限的。
- msgmni,每个系统上可以存在多少个消息队列也有自己的限制。
XSI IPC结构与消息队列结构
IPC是UNIX系统中进程间通信的统称,有三种称作XSI IPC:消息队列,信号量,共享内存。每创建这三种之间的任何一种,都相当于建立了一个XSI IPC对象。系统为每个IPC对象都维护了一种结构ipc_perm。
struct ipc_perm {
key_t __key; /* Key supplied to xxxget(2) */
uid_t uid; /* Effective UID of owner */
gid_t gid; /* Effective GID of owner */
uid_t cuid; /* Effective UID of creator */
gid_t cgid; /* Effective GID of creator */
unsigned short mode; /* Permissions */
unsigned short __seq; /* Sequence number */
};
其它的先不用管,我们先看它的第一个成员__key,它的类型为key_t。这是系统对IPC资源的唯一标识符。在申请IPC资源前,先要获取此标识符。我们可以通过ftok函数来获得它。
#include<sys/ipc.h>
key_t ftok(const char* path,int id);
第一个参数为给定的路径名,一般我们设置为当前路径“.”。第二个参数id为项目id,我们可以指定一个0~255之前的数来最为项目id。ftok函数会将路径名与项目id相结合,通过特定的方法得出标识符key。
除此之外,每个消息队列都有自己的结构:
(信号量,共享内存也有类似的结构)
操作函数
获取消息队列
#include<sys/msg.h>
int msgget(key_t key,int flag);