【GHS】系统编程-2-消息队列

编程开发   © 文章版权由 admin 解释,禁止匿名转载

#楼主# 2020-12-30

信号量** 和 **共享内存** 被统称为 **system-V IPC** * 以上都是“持续性”资源,即它们被创建之后, 不会因为进程的退出而消失 ## 4. 消息队列 ### 4.1 概念 * 消息队列 * 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法 ### 4.2 对比 * 消息队列与信号之间的对比 * 信号承载的信息量少,而消息队列可以承载大量自定义的数据 * 消息队列与管道之间的对比 * 相同 * 进程间通信都可以是不相关的进程 * 都可以独立于发送和接收进程而存在 * 在进程终止时,其内容并不会被删除 * 不同 * 在命名管道中,发送数据用 **write()**,接收数据用 **read()**, 则在消息队列中,发送数据用 **msgsnd()**,接收数据用 **msgrcv()** ,消息队列对每个数据都有一个最大长度的限制 * 管道只能承载无格式字节流,消息队列提供有格式的字节流 * 消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级,接收程序可以通过消息类型有选择地接收数据, 而不是像命名管道中那样,只能默认地接收 * 消息队列可以实现消息的随机查询,消息不一定要以先进先出的顺序接收,也可以按消息的类型接收 ### 4.3 函数及使用流程 * 使用流程: 1. 使用 **msgget()** 来创建或打开消息队列 2. 使用 **msgsnd()** 来发送消息到文末 3. 使用 **msgrcv()** 来接收消息,可指定某一条消息 4. 使用 **msgctl()** 来控制消息(*具体往下看*) #### 4.3.1 msgget() * 使用 **msgget()** 来创建或打开消息队列 * 通过命令 **man** 了解更多 * 函数原型:**`int msgget(key_t key, int msgflg);`** * key:消息队列的关键字值,多个进程可以通过它访问同一个消息队列 * msgflg:表示创建的消息队列的模式标志参数,主要有IPC_CREAT,IPC_EXCL和权限mode,如: * IPC_CREAT:没有关键字 **key** 的消息队列就新建一个,有就直接打开 * IPC_CREAT | IPC_EXCL:消息队列不存在,则新建一个,如果消息队列存在,则报错 * IPC_
:存放消息的结构体,结构体类型要与msgsnd()函数发送的类型相同 * msgsz:要接收消息的大小,不包含消息类型占用的4个字节 * msgtyp: * \> 0:表示接收类型等于msgtyp的第一个消息 * = 0:表示接收第一个消息 * 0:表示接收类型等于或者小于msgtyp绝对值的第一个消息 * msgflg: * 0:阻塞式接收消息,没有该类型的消息 msgrcv 函数一直阻塞等待 * IPC_NOWAIT:若在消息队列中并没有相应类型的消息可以接收,则函数立即返回,此时错误码为ENOMSG * IPC_EXCEPT:与 msgtype 配合使用返回队列中第一个类型不为 msgtype 的消息 * IPC_NOERROR:如果队列中满足条件的消息内容大于所请求的 size 字节,则把该消息截断,截断部分将被丢弃 * 返回: * 成功:返回接收到的消息长度 * 失败:返回 -1,错误原因存在于变量 **error** 中: * E2BIG:消息数据长度大于msgsz而msgflag没有设置IPC_NOERROR * EIDRM:消息队列已被删除 * EACCESS:无权限读取该消息队列 * EFAULT:参数msgp指向无效的内存地址 * ENOMSG:参数msgflg设为IPC_NOWAIT,而消息队列中无消息可读 * EINTR:等待读取队列内的消息情况下被信号中断 * 解除阻塞的三个条件: 1. 消息队列中已有符合条件的消息 2. 消息队列被删除 3. 调用 msgrcv() 的进程被信号中断 #### 4.3.4 msgctl() * 使用 **msgctl()** 来设置或者获取消息队列的相关属性等等 * 通过命令 **man** 了解更多 * 函数原型:**`int msgctl(int msqid, int cmd, struct msqid_ds *buf

成为第一个回答人

评论

登录后才可发表内容
  • 主题

    106

  • 帖子

    82

  • 关注者

    0

Copyright © 2019 凯特网.   Powered by HYBBS 2.3.4  

Runtime:0.4190s Mem:2048Kb