VxWorks管道(Pipe)创建与文件操作

VxWorks管道(Pipe)创建与文件操作
管道最明显的优势就是支持Select(),这样任务可以同时等待包括管道在内的一系列I/O设备上的数据。此外,PipeDrv提供的几个I/O控制命令也比较有用。
使用管道除了需要管道驱动PipeDrv(定义为宏INCLUDE_PIPES)支持外,还需要用到I/O系统库IoLib/IosLib(定义为宏INCLUDE_IO_SYSTEM)的支持,其他库支持视为应用需要,如SelectLib,使用这些库必须初始化自动在加入相应组件后自动调用。
  创建管道设备
#Include “PipeDrv.H”
STATUS PipeDevCreate(Char *Name,Int NMessages,Int NBytes);
参数Name表示创建的管道设备名称。该设备名称必须在所有I/O设备名称中唯一。后面两个参数指定管道容量:NMessages表示管道中最大消息条数,NBytes表示每条消息最大字节长度。
  管道文件操作
管道IPC采取I/O操作形式,需要打开管道文件进行。函数Open()打开一个管道文件:
#Include “IoLib.H”
Int Open(Const Char *Name,Int Flags,Int Mode);
扫描二维码关注公众号,回复: 3167340 查看本文章
参数Name需要和管道设备名称一致,Flags表示3种打开的读写方式之一:只读(O_RDONLY),只写(O_WRONLY),读写(O_RDWR)。对于管道文件,参数Mode指定为0。
成功时,返回一个非负整型数标识得到的管道的文件描述符,失败时返回ERROR。
参数Fd为Open()得到的文件描述符。
对于Read(),后面的参数表示接收管道数据的缓冲区Buffer及其大小Maxbytes,如果消息缓冲区数据大于Maxbytes,则超出部分被丢失。函数返回非负整数时表示实际读取的字节数,否则为ERROR。
对于Write(),参数Buffer和Nbytes表示要写入管道的数据缓冲区和缓冲数据字节长度。注意,Nbytes必须小于创建管道时指定的单条消息最大长度。成功时函数返回实际写入管道的字节数,总等于Nbytes,出错时函数返回ERROR。
函数Read()和Write()都可能阻塞。Write()允许从中断服务程序种调用,此时如果没有空闲缓冲区,函数立即返回ERROR而不阻塞。
管道文件不再使用时应该将其关闭,以减少I/O资源占用。由函数Close()完成。一般应该有和Open()个数相同的Close()
 
 
  删除管道设备
 
管道不再需要时可以删除以释放资源。
 
#Include “PipeDrv.H”
 
STATUS PipeDevDelete(Char *Name,BOOL Force);
 
参数Name表示管道设备名称,必须和创建时制定一致。参数Force表示是强制删除。在正常情况下删除管道必须满足两个约束:
 
1)所有该管道上打开的文件都已经关闭。
 
2)没有任务因该管道上Select操作而阻塞。不满足约束时,函数不会阻塞,而是返回ERROR。
 
  管道I/O控制
 
管道以I/O设备形式出现,因此相比前述其他IPC机制多了I/O控制功能。
 
1) FIOGETNAME Status=Ioctl(Fd,FLOGETNAME,&NameBuf)
 
取管道文件描述符对于的管道设备名称。
 
2) FIONREAD Status=Ioctl(Fd,FIONREAD,&NBytesUnread)
 
读管道中第一条消息剩余未读字节数到NBytesUnread。如果管道没有消息,NBytesUnread=0。
 
3) FIONMSGS Status=Ioctl(Fd,FIONMSGS,&NMessages)
 
取管道中剩余消息条数到NMessages。如果管道没有消息,NMessages=0。
 
4) FIOFLUSH Status=Ioctl(Fd,FIOFLUSH,0)
 
丢弃管道中所有消息。

猜你喜欢

转载自blog.csdn.net/ds1130071727/article/details/82586435