2011-03-08 130 views
0

我正在看如何編寫管道,並試圖瞭解標準c庫如何在一些細節中公開它們。我寫了下面的代碼,並預計輸出將是爲什麼這段代碼不會從管道讀取數據?

2 3 
MAJOR ERROR 
BYE 

但是第二行不顯示。有人可以解釋爲什麼會發生?

int main() 
{ 
    int rc; 
    int p[2]; 
    char buffer[40]; 

    close(2); 

    rc = pipe(p); 
    printf("%d %d\n", p[0], p[1]); 
    FILE* pipeWrite = fdopen(p[1], "w"); 
    fprintf(pipeWrite, "MAJOR ERROR\n"); 
    close(p[1]); 

    rc = read(p[0], buffer, 40); 
    buffer[rc] = '\0'; 
    printf("%s\n", buffer); 
    printf("BYE\n"); 

    return 0; 
} 

謝謝。

+0

管道是IPC工具之一。你的其他過程在哪裏? – 2011-03-08 06:58:23

+0

真的有必要嗎?我相信我在技術上允許將它們用作簡單的文件描述符。我知道這絕不會在實際環境中完成,但我正在這樣做,以簡單理解它們是如何工作的。 – 2011-03-08 06:59:47

回答

3

您正在使用標準IO緩衝操作(fprintf(3))寫入管道,但在刷新輸出之前關閉filedescriptor。在close(p[1]);調用之前立即添加fflush(pipeWrite);,查看您的輸出是否符合您的期望。 (您也可以使用fclose(pipeWrite);,因爲關閉標準IO流也會刷新輸出。)

有關標準IO流緩衝選項的更多詳細信息,請參見setvbuf(3)聯機幫助頁。

0

int main(){ int rc; int p [2]; char buffer [40];

close(2); 

rc = pipe(p); 
printf("%d %d\n", p[0], p[1]); 
FILE* pipeWrite = fdopen(p[1], "w"); 
fprintf(pipeWrite, "MAJOR ERROR\n"); 
close(p[1]); 

rc = read(p[0], buffer, 40); 
buffer[rc] = '\0'; 
printf("%s\n", buffer); 
printf("BYE\n"); 

return 0; } 

嘗試

#include <stdio.h> 
#include <unistd.h> 

int main() 
{ 
    int rc; 
    int p[2]; 
    char buffer[40]; 

    close(2); 

    pipe(p); 
    printf("%d %d\n", p[0], p[1]); 
    /* FILE* pipeWrite = fdopen(p[1], "w"); 
     fprintf(p[1], "MAJOR ERROR\n");*/ 
    if((rc = write(p[1], "MAJOR ERROR\n", 12)) > 0) 
     printf("Wrote to pipe\n"); 
    close(p[1]); 

    if((rc = read(p[0], buffer, 40)) > 0) 
     { buffer[rc] = '\0'; 
    printf("%s\n", buffer); 
    printf("BYE\n"); 
     } 

    return 0; 
} 

的許多方法來皮膚貓