qnx微内核支持三种基本类型的进程间通信:消息、代理和信号。
本文先学习第一种通信方法--消息。
消息是qnx中进程间通信的基本形式。一个消息是 一个将若干字节数据封装在一起组成的数据包,可以从一个进程同步地传递到另一个进程。
消息通用的C语言函数
/* 假定进程A通过发送一个请求向进程B发送消息 */
//进程A发送消息
Send(pid, smsg, rmsg, smsg_len, rmsg_len);
/* 参数说明
* pid 接收进程B的进程标识符
* smsg 保存待发送消息的缓冲区
* rmsg 保存接收进程B返回的回答消息
* smsg_len 待发送消息的长度
* rmsg_len 进程A可以接收的回答消息的最大长度
*/
//进程B接收消息
pid = Rcecive(0, msg, msg_len);
/* 参数说明
* 0 表示进程B接收来自任何进程的消息
* msg 用于接收消息的缓冲区
* msg_len 接收消息缓冲区的最大长度
* pid 返回值为发送进程A的pid
* 如果发送发调用Send()时所指定的smsg_len与接收方调用Recevie()时所指定的msg_len大小不同,
* 则使用两者中较小的值作为接收缓冲区的最大数据长度。
*/
//进程B向进程A返回的应答消息
Reply(pid, reply, reply_len);
/* 参数说明
* pid 接收该应答消息的进程A pid
* reply 应答消息缓冲区
* reply_len 应答消息缓冲区中数据的长度
* 如果reply_len和rmsg_len不同,则较小者为最终传输的长度。
*/
由于qnx的C函数库是建立在消息传递的基础之上的,所以当进程使用像管道(pipe)等标准服务时,将以间接方式使用消息传递机制。
消息是一种同步机制,因此在A与B通信时会有阻塞状态。
Send请求并且发送的消息对端进程尚未接收到 SEND阻塞
Send请求并且消息已被对端进程接收但是对端尚未给应答 REPLY阻塞
Receive请求并且未收到任何消息 RECEIVE阻塞