Board logo

标题: 关于FIONREAD和FIONMSGS [打印本页]

作者: 苹果也疯狂    时间: 2015-2-28 23:01     标题: 关于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取得管道中消息条数,比较管道容量即可知道继续发送 是否将被阻塞。

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




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0