进程通信与调试全解析
1. 消息队列特性
在消息队列的使用中,当允许消息在队列中等待时,消息会按优先级顺序而非顺序接收。例如执行./posix-msgq-ex命令后,会得到如下结果:
got pri 3 'No more messages.' len=18 got pri 1 'This is my first message.' len=26 got pri 1 'This is my second message.' len=27这里不需要使用wait函数进行同步,使用mq_receive也能同步,但消息顺序将无法确定,实际结果取决于具体实现和操作系统调度器。
POSIX 消息队列和 System V 消息队列在行为上存在显著差异,具体如下表所示:
| 特性 | System V 消息队列 | POSIX 消息队列 |
| — | — | — |
| 消息大小 | 只要读取值与写入值匹配,消息大小可变化 | 发送方可以写入可变长度消息,但接收方必须为固定消息大小提供足够空间,msg_receive调用时若给定大小不足以容纳完整消息则会失败 |
| 消息优先级 | 允许接收方根据特定优先级进行基本的消息过滤 | 消息严格按优先级顺序传递,接收方不能选择读取的优先级,也不能阻塞直到特定优先级的消息可用,读取操作总是获取队列中优先级最高的消息,若队列中有多个相同优先级的消息,则按先进先出原则读取 | <