开始学习
< 返回

QNX 进程间通信

概述

QNX 内核提供了基于消息的进程间通信(message-based interprocess communication)机制。IPC(进程间通信,inter-process communication)能有效地管理任务之间的信息传输,QNX 系统中所有的系统服务、设备驱动和应用都依赖于它。

QNX 支持三种基本的 IPC 消息、代理和信号。

  • 消息(Message):QNX 最基本的 IPC,提供进程间同步通信,发送者和接收者有应答。
  • 代理(proxy):消息的一种特殊形式,非常适合事件通知,发送者不用和接收者进行交互。
  • 信号(signal):IPC 的一种传统形式,通常用于支持异步 IPC。

除此之外,QNX 也支持共享内存、消息队列等在任务间传输信息的方法,下面分别对它们进行说明。

内部任务消息

消息是一组数据,这些数据从一个任务传送到另一个任务,数据从第一个任务地址空间复制到第二个任务地址空间时,第一个任务的执行将被挂起,直到第二个任务返回应答消息。消息是进程间通信的基本形式。QNX 不对消息的内容附加任何解释信息,因此消息的内容仅对消息的发送者及接收者有意义。

对消息的主要操作是发送、接收和应答。相关函数包括:

函数 说明
Send() 发送消息
Receive() 接收消息
Reply() 给发消息者回消息(应答)

注意:发送者必须得到接收者的应答,否则进程将被阻塞。也就是说,这种通信是同步通信。

代理

代理是 QNX 特有的一种消息通信形式。代理是一种非阻塞式的消息,特别适用于事件通知亦即发送进程不需要与接收进程进行交互的场合。一个代理的唯一作用就是向拥有该代理的特定进程传送一个固定消息。通过使用代理,一个进程或一个中断处理程序可以在不被阻塞和不必等待回答的情况下向另一个进程发送消息。

适合使用代理的一些场景:

  • 一个进程通知另一个进程某一事件发生;
  • 一个进程想给另一个进程发送数据,但是并不需要应答;
  • 中断处理器(interrupt handler)想告诉某一进程有数据需要处理。

相关函数包括:

函数 说明
qnx_proxy_attach() 创建 proxy
Trigger() 触发事件

信号

信号是一种已使用了几十年的被各种操作系统用于进程之间异步通信的传统方法。QNX 支持一个内容丰富的 POSIX 兼容的信号集合,既有 UNIX 家族信号,也有 QNX 特定的信号。

共享内存

在 QNX 中,所有已分配的内存都被已激活的任务所拥有,共享内存意味着至少有一个其它任务通过指针直接存取某任务已拥有的数据。当然,这种共享内存的任务是在同一物理节点上。共享内存是交换信息最快的方法,但若不采取同步措施,往往也容易出错。例如,两个任务同时修改一个记录而没有协调,则一个修改就会丢失。这一点在编程时要特别注意。

消息队列

QNX 还提供了另一种形式的消息,称为队列。一个队列是一个简单数据域,它由另一个任务管理。该任务暂时接收和发送消息,并立即向发送这应答。这时,并不象标准的消息传输,发送这可立即解挂而继续执行。队列保存消息直到接收任务将它取走,接收任务直接向队列请求消息。

Was this article helpful?
0 out of 5 stars
5 Stars 0%
4 Stars 0%
3 Stars 0%
2 Stars 0%
1 Stars 0%
Please Share Your Feedback
How Can We Improve This Article?
文章目录