1. 创建消息队列
|
成功返回队列ID,失败返回-1。
参数 | 说明 |
key | 创建/打开队列key值,由ftok产生,可以直接给常量 |
msgflg | 创建/打开方式IPC_CREAT、IPC_EXCL、IPC_NOWAIT |
通常是msgflg =IPC_CREAT| IPC_EXCL|0666,意思是若不存在key值的队列则创建,否则如果存在则打开队列,0666意思与一般文件权限一样,XXX-本用户,同组用户,其他用户的读写执行的权限。
|
//获取pathname相对应的一个键值, pathname必须是存在并且可读取的文件,proj_id表示序号,用来区别同时的存在文件。成功返回key值,失败返回-1。
2. 队列读写
|
a) 读取数据――阻塞读取消息队列,直到解除阻塞。
|
参数 | 说明 |
msqid | 已打开的消息队列id |
msgp | 接收存放的消息队列缓存结构 |
msgsz | 消息数据长度 |
msgtyp | 消息类型。=0返回队列中的第一个消息;>0返回队列中类型为msgtyp的第一个消息;<0返回队列中消息类型<=msgtyp绝对值的消息,如果有若干个去最小的。 |
msgflg | 读取标志通常使用IPC_NOWAIT:即没有满足条件的消息,立即返回,此时,错误代码errno=ENOMSG IPC_EXCEPT:与msgtyp>0配合使用,返回队列中第一个类型不为msgtyp的消息 MSG_NOERROR:截断超长数据 |
缓冲内容结构如下:
|
msgrcv()解除阻塞的条件三个条件:
1. 消息队列中有了满足条件的消息(或使用了);
2. msqid代表的消息队列被删除;
3. 调用msgrcv()的进程被信号中断;
a) 发送数据
int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg);
参数 | 说明 |
msqid | 已打开的消息队列id |
msgp | 发送存放的消息队列缓存结构 |
msgsz | 消息数据长度 |
msgflg | 消息类型。=0 读取队列中第一个数据。 |
|
|
3. 消息队列控制
|
成功返回0,失败返回-1。
参数 | 说明 |
msqid | 已打开的消息队列id |
cmd | 控制类型选项 IPC_STAT:取得队列状态 IPC_SET:设置队列属性 IPC_RMID:删除消息队列 |
buf | 存放队列的属性结构 |
队列属性如下:
|