unix 消息队列实例
本文来自:http://blog.sina.com.cn/s/blog_413fbf500100vyyj.html
unix系统中进程可以通过消息进行通信,消息是格式化的可变长度的信息单元,包含消息类型、数据长度及数据三部分内容。每个消息都有一个唯一的名称key,同时还有一个唯一的消息队列描述符。
消息队列的使用:
1、建立:
调用: int msgget(int key,int flags);
key为消息队列名称,flags为用户设置标志,一般设置消息队列的访问权限等,权限取值如下:
权限 八进制整数
用户可写 0400
用户可读 0200
同组可写 0040
同组可读 0020
其它可写 0004
用户可读 0002
权限值可加和组合,如 msgget(0x888,0660|IPC_CREAT) 表示创建队列名称为0x888,用户和同组可读写的消息队列,返回队列描述符,如果该消息队列已存在则返回对应的消息队列描述符。
2、发送:
调用: int msgsnd(int msgid,(void*)&mymsg,int msgsz,int msgflg)
msgid为msgget返回的消息队列描述符,mymsg是指向发送消息的结构,结构需要定义,格式如:
struct mymsg{
long mytype; //消息类型
char msgtext[]; //消息内容
}
msgsz是消息内容msgtext的长度,msgflg是消息设置,一般指定无内存存储消息时进程等待还是返回。
函数成功返回0 失败返回 -1
3、接收:
调用 int msgrcv(int msgid,(void*)&mymsg,int msgsz,int msgtyp,int msgflg)
msgid、mymsg、msgsz、msgflg都与msgsnd的一致,msgtyp指定用户读取消息的类型,如:
(1) msgtyp=0,返回Unix消息队列中的第一个消息
(2) msgtyp>0,返回Unix消息队列中类型为msgtyp的第一个消息
(3) msgtyp<0,返回Unix消息队列中小于等于msgtyp绝对值的最低类型的第一个消息
函数成功返回0 失败返回 -1。
4、消息队列的控制:
调用: int msgctl(int msgid,int cmd,(struct msgid_ds *)&buf)
msgid是要操作的队列描述符,cmd是操作类型,如:
&n