进程间通讯——消息队列

来源:互联网 发布:广西网络教育培训网 编辑:程序博客网 时间:2024/06/06 04:00

1、概念:

        消息队列与管道有许多相似之处,但少了打开管道和关闭管道的复杂操 作,它提供了一种两个不相关的进程之间传递数据简单且有效的方法。 与命名管道相比,消息队列的优势在于,它独立于发送和接收进程儿存 在,与管道一样的是都有长度限制,这里的长度限制是指消息队列提供向 一个进程向另一个进程发送数据块方法中数据块的最大长度限制。

2、消息队列的函数: #include<sys/msg.h>

  (1) msgget函数:创建和访问一个消息队列

     int msgget(key_t key,int msgflg);

     key:键值,命名某个特定的消息队列;

     msgflg:权限以及控制,IPC_CREAT标志:消息队列若存在就获取,不存在则 创建;     

    返回值:成功时返回队列标识符,失败时返回-1;

 (2) msgsnd: 把消息添加到消息队列中;

      int msgsnd(int msqid,const void *msg_ptr,size_t  size,int flag);

     msqid:由msgget函数返回的消息队列标识符; 

     msg_ptr:指向准备发送消息的指针,消息是一个结构体的长整型成员变量;     

     size:数据的大小; 

     flag:控制当前消息队列队满或达到限制; 

    返回值:成功返回0,失败返回-1; 

 (3) msgrcv:从一个消息队列中获取消息;      

      int msgrcv(int msqid,void *msg_ptr,size_t size,long int msgtype,int flag);       

      msqid:由msgget函数返回的消息队列标识符;       

      msg_ptr:指向准备接收消息的指针,息是一个结构体的长整型成员变量;      

     size:数据的大小;      

     msgtype:实现简单的接收优先级,如果msgtype的值为0,获取队列中第一个可用消息;如果msgtype的值大于0,获取具有相同息类型的第一个 消息;如果msgtype的值小

                      于0,获取消息类型等于或小于msgtype 绝对值的第一个消息;      

      flag:控制当队列中没有相应类型的消息可以接收时将发生的事。       

      返回值:成功返回接收缓存区的字节数,失败返回-1. 

 (4) msgctl:删除消息队列,与共享内存的控制函数相似;      

       int msgctl(int msqid,int command,struct msqid_ds *buf);       

       msqid:由msgget函数返回的消息队列标识符;      

       返回值:成功返回0,失败返回-1;

3、特点      

     与信号量相比:           

            都是以内核对象来确保多进程访问同一个消息队列,信号量进行同步控制,消息队列则发送实际数据;      

    与管道相比:             

           管道发送的数据没有类型,读取数据端无差别从管道中按照数据的前后顺序数据读取;消息队列数据有类型,读端可以根据类型读取特定数据。

原创粉丝点击