2011-01-25 4 views
1

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 

私は何を期待していないのですか?

ありがとうございます。

答えて

6

出力がパイプを通過するように、書き込み後に明示的にfflushする必要があります。それ以外の場合、出力は書き込みプロセス 'stdioバッファーのままになる可能性があります。 (setvbuf(stdio, NULL, _IONBF, 0)でバッファリングをオフにすることもできます)

+0

ありがとうございます。 fflush(NULL)を追加しました。各printfの後にそれが動作するようになりました。 – user589082

関連する問題