现在的位置: 首页 > 综合 > 正文

【VxWorks系列】任务间同步与通信之管道

2013年11月15日 ⁄ 综合 ⁄ 共 886字 ⁄ 字号 评论关闭

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复用的描述。


看到这里,有人会说,那管道在使用和功能上不是完胜消息队列吗,是不是大家都应该使用管道啊?当然不是,其实两者各有特点,前文中也有提到,消息队列支持在读和写操作时设置超时时间,同时还支持设置消息类型(URGENT还是NORMAL)等,而管道并不支持这些,它只是支持通用I/O操作所具有的接口形式。所以具体如何选择还是看实际的应用。

总的来说,消息队列更符合通用的任务间通信的使用习惯,也更容易控制,而当需要通过多路I/O复用来优化程序处理时,则可以考虑使用管道。

抱歉!评论已关闭.