温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-04-03 20:37:57 来源:网络 阅读:397 作者:下一个明天 栏目:编程语言

    什么是消息队列?

    消息队列提供了一种从进程向另一个进程发送一个数据块的方法。每个数据块都被认为是有一个类型,接收者进程的数据块可以有不同的类型值。


    消息队列与管道的区别:消息队列是基于消息的,而管道是基于字节流的,且消息队列的读取不一定是先入先出。


    相关函数

  1. 创建新消息队列或取得已存在消息队列


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

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

  2. 返回值:成功,返回消息队列的标识符

            失败,返回-1

   第一个参数:消息队列对象的关键字,函数将它与已有的消息队列对象的关键字进行比较来判断消息                队列是否已经创建。由函数ftok()得来。

   第二个参数:控制函数的具体操作。可以取以下几个值:

   IPC_CREAT:如果消息队列不存在则创建,否则直接打开。

   IPC_EXCL:单独使用无意义。

   IPC_CREAR | IPC_EXCL :消息队列时新创建的。


3. ftok函数

   函数ftok把一个已存在的路径名和一个整数标识得转换成一个key_t值,称为IPC键。

   key_t ftok(const char* patnname,int id);

   pathname:路径必须存在且可以访问

   id: 低8位


4. 向队列读/写消息

   

   msgsnd将数据放到消息队列中,msgrcv从队列中取消息

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


    msqid: 消息队列的标识符

    msgp:  指向消息缓冲区的指针,此位置用来暂时存储发送和接受的消息,是用户定义的通用的结构。

    msgsz:消息的大小

    msgtyp:从消息队列内读取的消息形态。若为0,则消息队列中的所有消息都被取完。

    msgflg: msgflg为0时,msgsnd()和msgrcv()在队列呈满或空的情形时,采取阻塞等待的处理模式。

            msgflg和常数连用时,msgsnd()执行时若队列满,msgrcv()将不会阻塞,而是返回-1,若             执行msgrcv(),则在消息队列呈空时,等待不做返回-1.


5. 设置消息队列的属性

   函数原型: int msgctl(int msgqid,int cmd,struct msqid_ds *buf);

   对msgqid标识的消息队列执行cmd操作。cmd操作分三种:IPC_STAT,IPC_SET,IPC_RMID

   IPC_STAT:该命令用来获取消息队列对应的msqid_ds数据结构,并将其保存到buf指定的地址空间。

   IPC_SET:该命令用来设置消息队列的属性,要设置的属性存储在buf中。

   IPC_RMID:从内核中删除msqid标识的消息队列。


6. 查看消息队列    ipcs -q

   删除消息队列    ipcrm -q semid


“comm.h”

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


“comm.c”

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

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

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

“client.c”

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


“server.c”

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


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



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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI