0

パイプを使用して、2 つの 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 回の読み取りを行います。

私たちが気付いたのは、2 回目の読み取りでデータがまったく受信されていないことです。

何故ですか?

4

1 に答える 1

2

VxWorks のパイプ メカニズムはストリーム ベースではありません(UNIX の名前付きパイプとは異なります)。

これは、vxWorks メッセージ キュー機能の上にあるレイヤーです。そのため、メッセージ キューと同じ制限があります。パイプから読み取る場合、実際にはメッセージ全体を読み取ることになります。受信バッファに受信データを格納するのに十分なスペースがない場合、オーバーフローは単純に破棄されます。

メッセージ キューまたはパイプで受信を行うときは、バッファーがキュー要素の最大サイズに設定されていることを常に確認してください。

于 2008-09-22T20:46:11.400 に答える