2011-01-25 46 views
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 

爲什麼我沒有得到我的預期?

在此先感謝。

回答

6

寫入後需要明確地寫出fflush,以便輸出通過管道。否則,輸出可能會停留在寫入過程'stdio緩衝區中。 (您也可以使用setvbuf(stdio, NULL, _IONBF, 0)關閉緩衝區。)

+0

謝謝。我添加了fflush(NULL);每個printf之後,它現在工作。 – user589082 2011-01-25 15:11:12