VxWorks提供了一种类似消息队列的任务间数据通信的机制----管道。管道的作用跟消息队列几乎完全一致,就是可以帮助把数据从一个任务发送给另一个任务,但是功能类似,使用方式却截然不同。管道属于一种虚拟的I/O设备,所以它的相关API跟统一I/O访问接口完全一致,比如open,close,read,write等。也就是说它提供了一组通用的I/O操作接口,对使用者来说非常方便。
下面可以看一段管道使用的代码:
// 创建管道虚拟I/O设备 pipeDevCreate("/pipe/try1", 10, 100); // 打开该设备 int fd = open ("/pipe/try1", O_RDWR, 0); // 向管道写入数据 write (fd, (char*)&inData, sizeof(inData)); // 从管道读取数据 int len = read (fd, (char*)&outData, sizeof(outData));
从如上代码可以看出,创建完管道后的处理完全跟通用I/O接口的使用是完全相同的,对C/C++程序原来说几乎没有额外的学习成本。所以你访问管道可以跟其他I/O访问的处理一样,优化了代码的通用性。同时,使用管道还带来另一种好处,它支持多路I/O复用----select。大家知道select支持绝大多数的异步I/O设备的操作,包括Socket,串行设备等。所以使用select可以使一个任务同时监听多组不同的I/O设备,大大提高程序性能。关于select,大家也可以参考我的《服务器模型分析与验证》中对多路I/O复用的描述。