Linux上で2つのプロセスを2つの名前付きパイプを使用して通信させたいとします。 各プロセスはUnixフィルタです。標準入力でデータを読み取り、標準出力にデータを書き込みます。 これらは、第1の出力が第2の入力であり、逆の入力であるという点で循環的にリンクされています。ここLinux上で2つの名前付きパイプ(FIFO)で循環リンクされた2つのフィルタ
は、第1のフィルタ(AC)のコードである:ここ
#include <stdio.h>
int main(void ){
FILE* ferr = fopen("/dev/stderr", "w");
double d;
fprintf(ferr,"A is going to write\n");
printf("%lf\n",1.);
fprintf(ferr,"A wrote %lf\n",1.);
while(1){
fprintf(ferr,"A is going to read\n");
if(scanf("%lf",&d) == EOF){
break;
}
fprintf(ferr,"A recieved : %lf\n",d);
d += 1;
fprintf(ferr,"A is going to write\n");
printf("%lf\n",d);
fprintf(ferr,"A wrote %lf\n",d);
}
return 0;
}
は、第二のフィルタ(BC)のコードである:
#include <stdio.h>
int main(void ){
FILE* ferr = fopen("/dev/stderr", "w");
double d;
while(1){
fprintf(ferr,"B is going to read\n");
if(scanf("%lf",&d) == EOF){
break;
}
fprintf(ferr,"B recieved : %lf\n",d);
d += 1;
fprintf(ferr,"B is going to write\n");
printf("%lf\n",d);
fprintf(ferr,"B wrote %lf\n",d);
}
return 0;
}
Iは、(gcc -o A a.c && gcc -o B b.c
)をコンパイル、両者を作成しますfifos(mkfifo b2a ; mkfifo a2b
)、端末(cat a2b | ./B > b2a
)で最初のプログラムを実行し、新しい端末を開き、2番目のプログラム(cat b2a | ./A > a2b
)を実行します。
私が期待したのは、AとBが順番に番号を増やしていく無限ループでしたが、私が得たものはBがついていてAが書いたものを読むことができませんでした。私はBを立ち上げた用語で
、私が手に:私はAを立ち上げ、端末で
B is going to read
を、私が取得:
A is going to write
A wrote 1.000000
A is going to read
私はlsofを使用する場合:
lsof b2a a2b
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
cat 24382 john doe 3r FIFO 0,22 0t0 282149936 a2b
B 24383 john doe 1w FIFO 0,22 0t0 282149934 b2a
cat 24413 john doe 3r FIFO 0,22 0t0 282149934 b2a
A 24414 john doe 1w FIFO 0,22 0t0 282149936 a2b
私は何を期待していないのですか?
ありがとうございます。
ありがとうございます。 fflush(NULL)を追加しました。各printfの後にそれが動作するようになりました。 – user589082