首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

关于FIONREAD和FIONMSGS

关于FIONREAD和FIONMSGS

对于磁盘文件,可以通过FIONREAD分多次读取数据,对于管道,参考下列代码:

   NBytesRead=Read(PipeFd,Buffer,N);

   If(Ioctl(PipeFd,FIONREAD,&NBytesUnread)!=ERROR)

     NBytesRead+=Read(PipeFd,Buffer+NBytesRead,NBytesUnread);

上述程序操作的原因是:不要期望上述语句会恰好读出一条消息。在任何情况下,不论第一条语句中N为何值(N>0),上述第一次Read()是针对管道中第一条消息,而Ioctl()和第二次Read()是针对管道中第二条消息。源于VxWorks管道是基于消息队列这一特性,对于一条消息只能通过一次读取,如果该条消息没有读完,则管道将剩余部分丢弃,同时FIONREAD只能得到下一条消息长度。

FIONREAD最大的用途在于:读取管道的任务可以先据此判断管道中是否有消息(有则NBytesUnread大于0),然后作相应处理以避免阻塞。另外一个用途是在读取一条消息之前得到消息长度,然后分配缓冲区。如果消息都很短,后一个用途是不重要的。

与FIONREAD对应,命令FIONMSGS为消息发送者提供了避免阻塞的方法、同样是先通过FIONMSGS取得管道中消息条数,比较管道容量即可知道继续发送 是否将被阻塞。

必须指出,在多生产者或消费者应用环境下,不仔细考虑任务调度时,不论发送任务还是接收任务,上述避免阻塞的做法都是不可靠的,当然容易利用互斥信号量实现可靠的避免阻塞。
返回列表