8.进程间通信---消息队列

使用消息队列实现进程间的通信
    首先将发送的数据打包成消息的类型,使用一个进程负责将消息发送到消息队列中,另外一个进程负责从消息队列中接收信息,从而实现进程间通信
1 使用消息队列通信的基本流程
(1)获取key值,使用ftok函数
   ftok函数
   #include <sys/types.h>
   #include <sys/ipc.h>
   key_t  ftok(const char *pathname,int proj_id);
   第一个参数:字符串形式的路径名(必须存在,可以访问)
   第二个参数:项目ID,取低8位(必须是非0)
   返回值:成功返回生成的key值,失败返回-1
   函数功能:
      主要用于根据参数指定的路径和项目ID,生成一个key值


   注意:
      如果使用相同的路径名和项目ID,则生成相同的key值




(2)创建/获取消息队列,使用msgget函数
   msgget函数
   #include <sys/types.h>
   #include <sys/ipc.h>
   #include <sys/msg.h>
   int msgget(key_t key, int msgflg);
   第一个参数:key值,ftok函数的返回值
   第二个参数:操作标志
       IPC_CREAT - 创建消息队列
       IPC_EXCL - 与IPC_CREAT搭配使用,存在则创建失败
       0   - 表示获取已存在的消息队列
   返回值:成功返回消息队列的ID,失败返回-1
   函数功能:主要用于获取一个消息队列的ID


   注意:
       当创建一个新的消息队列时,需要在第二个参数中指定消息队列的权限,如:0644
   
   
(3)发送/接受消息队列中的消息,使用msgsnd/msgrcv函数
   msgsnd函数
   #include <sys/types.h>
   #include <sys/ipc.h>
   #include <sys/msg.h>
   int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
   第一个参数:消息队列的ID,msgget函数的返回值
   第二个参数:消息的首地址,消息的格式如下:
   struct msgbuf 
   {
       long mtype;/*消息的类型, must be > 0 */
       char mtext[1];/*消息的内容,可以是其他数据类型*/
   };
   第三个参数:消息的大小
      指消息内容的大小,不包括消息的类型
   第四个参数:发送的方式,一般给0即可
   函数功能:主要用于发送指定的消息到指定的消息队列中


   msgrcv函数
   ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
   第一个参数:消息队列的ID,msgget函数的返回值
   第二个参数:存放接受到消息的首地址
   第三个参数:消息的大小
   第四个参数:消息的类型
      0  - 读取消息队列中的第一个消息
      >0 - 读取消息队列中第一个类型为msgtyp的消息
      <0 - 读取消息队列中<=msgtyp绝对值的消息,最小的优先读取
   第五个参数:接受的方式,一般给0即可
   返回值:成功返回接受的消息大小,失败返回-1
   函数功能:主要用于从指定的消息队列中接受消息




(4)如果不再使用,则删除消息队列,使用msgctl函数
   msgctl函数
   #include <sys/types.h>
   #include <sys/ipc.h>
   #include <sys/msg.h>
   int msgctl(int msqid,int cmd,struct msqidds *buf);
第一个参数:消息队列的ID,msgget函数的返回值
第二个参数:操作的命令
    IPC_RMID - 删除指定的消息队列,第三个参数给NULL
第三个参数:结构体指针

函数功能:主要用于对指定的消息队列执行指定的操作


          

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值