为什么使用 vxWorks 管道时会丢失数据?
我正在使用管道在两个 vxWorks 任务之间传输信息。
下面是一个代码示例:
Init()
{
fd = open("/pipe/mydev", O_RDWR, 0777);
...
}
taskRx()
{
...
len = read(fd, rxbuf, MAX_RX_LEN);
...
}
taskTx()
{
...
len = write(fd, txbuf, txLen);
...
}
如果我们发送的消息长度超过 MAX_RX_LEN(即 txLen > MAX_RX_LEN),我们将执行 2 次读取来获取消息的剩余部分。
我们注意到第二次读取没有收到任何数据!
这是为什么?
I am using pipes to transfer information between two vxWorks tasks.
Here is a code sample:
Init()
{
fd = open("/pipe/mydev", O_RDWR, 0777);
...
}
taskRx()
{
...
len = read(fd, rxbuf, MAX_RX_LEN);
...
}
taskTx()
{
...
len = write(fd, txbuf, txLen);
...
}
If we send a message that is longer than MAX_RX_LEN, (ie txLen > MAX_RX_LEN) we do 2 reads to get the remainder of the message.
What we noticed is that the 2nd read didn't receive any data!
Why is that?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
VxWorks 的管道机制不是基于流(与unix 命名管道不同)。
它是 vxWorks 消息队列设施之上的一层。 因此,它具有与消息队列相同的限制:从管道读取时,您实际上正在读取整个消息。 如果您的接收缓冲区没有足够的空间来存储接收到的数据,则溢出将被简单地丢弃。
在消息队列或管道上执行接收时,始终确保缓冲区设置为队列元素的最大大小。
VxWorks' pipe mechanism is not stream based (unlike unix named pipes).
It is a layer on top of the vxWorks message Queue facility. As such, it has the same limitations as a message queue: when reading from the pipe, you are really reading the entire message. If your receive buffer does not have enough space to store the received data, the overflow is simply discarded.
When doing a receive on a message Queue or a pipe, always make sure the buffer is set to the maximum size of a queue element.