为什么使用 vxWorks 管道时会丢失数据?

发布于 2024-07-05 16:50:57 字数 396 浏览 6 评论 0原文

我正在使用管道在两个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

绝不服输 2024-07-12 16:50:57

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文