LinuxIPC消息队列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys.msg.h>
int msgget(key_t key,int msgflg);
int msgsnd(int msqid,struct msgbuf *msgp,size_t msgsz,int msgflg);
ssize_t msgrcv(int msqid,struct msgbuf *msgp,size_t msgsz,long msgtyp,int msgflg);
int msgctl(int msqid,int cmd,struct msqid_ds *buf);
//msgget创建和访问一个消息队列。成功返回唯一的消息队列标识符,失败返回-1;
//key是唯一标识一个消息队列的关键词,如果为IPC_PRIVATE(0)则创建一个只用创建者才可以访问额消息队列,可用于父子之间通信。
//msgflg知名队列的访问权限和创建标志,IPC_CREAT或IPC_EXCL
//msgsnd和msgrcy用来将消息添加到消息队列中和从一个消息队列中获取信息
//参数msgid指明消息队列的ID(通常是msgget的返回值)
//参数misbuf是消息结构体,长度必须小于系统规定的上限,必须以一个长整型成员变量开始,接收函数将用这个成员变量来确定消息类型
struct msgbuf{
long mtype; //type of message
char mtext[1];//message text
};
//mtype是用户自己指定的消息类型,第二个成员是说明性结构,可以使用任何类型,就是消息内容
//参数msgsz是消息体的大小,每个消息体最大不要超过4K
//msgflg可以为0(通常情况)或IPC_NOWAIT(此选项下,msgsnd和msgrcv不会阻塞,如果队列满并调用msgsnd或者队列空调用msgrcv将返回错误)
//参数mstyp有三种选项:
//==0 接收队列中第一个消息(通常为0)
//>0 接收队列中第一个类型等于msgtyp的消息
//<0 接收其类型小于或者等于msgtyp绝对值的第一个最低类型消息
//函数msgctl是消息队列的控制函数,常用来删除消息队列
//参数msqid是消息队列标识符
//参数cmd通常是IPC_RMID表示删除消息队列
//参数buf通常是NULL即可