日期:2014-05-16  浏览次数:20808 次

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