1

Linux で C の fifo ファイルを使用しているときに奇妙な問題が発生しました。

コードから始めましょう:

#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>

int main(int args, char *argv[])
{
mkfifo("fif",0666);
int x = fork();

if(x!=0)
{
     if(strcmp(argv[1],"read")==0)
     {
     int rea=open("fif",O_RDONLY,0666);
     wait(NULL);
     char buf[50];
     read(rea,buf,50);
     printf("\n %s \n",buf);
     close(rea);
     }
}

else
{
     if(strcmp(argv[1],"write")==0)
     {
     int wri=open("fif",O_WRONLY,0666);
     write(wri,argv[2],strlen(argv[2])+1);
     close(wri);
     }
}



return 0;
}

ここで、コードで実行したいことの詳細を説明します。

このようなプログラムを実行した後:

./prog write hello
./prog write how
./prog write are_you
./prog read

端末に入れたい:

hello
how
are_you

しかし、これの代わりに、私はこれだけを得ています:

are_you

問題は、FIFO にいくつかのメッセージを書き込みたいのですが、FIFO を読み取ることによって、そこに格納されているテキスト全体を受信することです。しかし、残念ながら、最後のメッセージのみが標準出力 (この場合は端末) に保存/書き込まれます。実行されたコマンドは次のとおりです。

./prog write are_you

この行を削除しようとしました:

mkfifo("fif",0666);

FIFO ファイルが既に存在する場合、この行で既存の FIFO ファイルが作成され、上書きされる可能性があると考えたからです。しかし、これは何も変わりませんでした。

では、これを意図したとおりに機能させるにはどうすればよいでしょうか?

4

1 に答える 1

1

\0まず、終了文字を FIFO に書き込んでいることに注意してください。

 write(wri,argv[2],strlen(argv[2])+1);

fifo の内容を読み取るときは、\0文字も読み取り、データを に渡しますprintf。問題はprintf、最初の文字列が見つかったときに文字列の読み取りを停止する\0ため、fifo からの最初のメッセージのみが表示されることです。

次の環境で read プログラムを実行すると、これがはっきりとわかりますstrace

read(3, "are_you\0hello\0how\0", 50)    = 18
...(snip)...
write(1, " are_you \n", 10)             = 10
于 2014-11-11T13:45:01.393 に答える