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 ファイルが作成され、上書きされる可能性があると考えたからです。しかし、これは何も変わりませんでした。
では、これを意図したとおりに機能させるにはどうすればよいでしょうか?