0

私は fifo の書き込みと読み取りを実装しようとしましたが、シナリオは次のようなものです。writer1 は fifo に 4 バイトを書き込み、reader1 はそれらの 2 バイトを読み取り、reader2 は次の 2 バイトを読み取ります。以下は私が行ったことです。

ライター.c

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
int main()
{
FILE *file;
unsigned char message[] = {0x66,0x66,0x67,0x67};
file = fopen("fifo1","wb");
fwrite(&message, 1,4,file);
}

リーダー.c

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
int main()
{
FILE *file;
unsigned char buff[2];
file = fopen("fifo1","rb");
fread(&buff, 1,2,file);

printf("%c\n",buff[0]);printf("%c\n",buff[1]);
}

次に、それらの両方に準拠し、最初の端末でreader1を実行し、2番目の端末でreader2を実行し、3番目の端末でwriterを実行しました。

最初の 2 バイト (ff) を一方のリーダーで取得し、次の 2 バイト (gg) をもう一方のリーダーで取得できると思っていましたが、思ったように機能しませんでした。誰が最初の 2 バイトを読み取ったか、次の 2 バイトを読み取ったかは気にしないことに注意してください。ここで重要なのは、両方のリーダーが一度に 2 バイトを読み取ることです。Ubuntu、GCC mkfifo を使用して fifo を作成しています。

4

2 に答える 2

0

この機能を削除してこの例を単純化したかもしれませんが、リーダーがファイルの存在を確認するのを待っていないのはなぜですか? 何かのようなもの:

while (!fopen("fifo1","rb) {
  wait(10);
}
fread...

または、少なくともそれが開いていることを保証します

if (!fopen("fifo1", "rb) {
  printf("error, cannont open file");
}

各スクリプトも手動でテストします。ライターを実行します。そして、ファイルに期待どおりのものがあるかどうかを確認してください。ファイルを手動でそこに置き、リーダーが実際にファイルを見つけて読み取っていることを確認します。

于 2012-08-27T03:53:46.913 に答える
0

freadバッファリングされているため、4 バイトすべてを読み取ってから、要求した 2 バイトを取得します。

求める動作を得るには、openreadの代わりにfopenと を使用しfreadます。

于 2012-08-27T03:56:16.010 に答える