1
我想讓兩個進程通過Linux上的兩個命名管道相互通信。 每個進程都是一個Unix過濾器:它讀取標準輸入上的數據並在其標準輸出上寫入數據。 它們是循環鏈接的,第一個的輸出是第二個輸入,另一個是輸入。在Linux上由兩個命名管道(FIFO)循環鏈接的兩個過濾器
這裏是第一過濾器(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;
}
我編譯(gcc -o A a.c && gcc -o B b.c
),創建兩個fifos(mkfifo b2a ; mkfifo a2b
),運行終端中的第一個程序(cat a2b | ./B > b2a
),打開一個新終端並運行第二個程序(cat b2a | ./A > a2b
)。
我所期望的是一個無限循環,A和B依次遞增,但我得到的是B被卡住了,無法讀取A寫的內容。
在我推出B中的術語,我得到:
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 2011-01-25 15:11:12