2013-05-11 63 views
0

我是一個新手,試圖真的明白系統編程。在下面的程序中,我正在讀取名爲'temp1'(包含1 2 3 4)的文件並將其內容打印到stdout。不過,我也想檢查打開返回的文件描述符的值。如果我在第5行的printf調用中包含'\ n',則輸出將首先輸出filep值,然後輸出文件的內容。但是,如果我刪除換行符,則首先打印文件的內容,然後再打印filep的值。 爲什麼會發生這種情況?C/Unix使用系統調用和printf的奇怪行爲

 int main(){ 
    char buf[BUFSIZ]; 
    int n, filep; 

    // Open the file 
    filep = open("temp1", 'r'); 
    printf("%d\n", filep); // the newline alters program behaviour 

    while((n=read(filep, buf, BUFSIZ)) > 0) 
     write(1, buf, n); 
    return 0; 
    } 

我使用的是gcc 4.6.3。

+2

@GrijeshChauhan:?? open syscall返回一個文件描述符,它是一個整數。 printf打印該文件描述符的值。 – hssay 2013-05-11 07:33:04

+0

是的你是對的! ...考慮我評論的第二點 – 2013-05-11 07:35:02

回答

2

<stdio.h>功能如printf緩衝。輸出函數只會不時地調用write(2)系統調用,通常輸出函數如printf等......只會進入內部的FILE緩衝區。

當輸出到終端時,stdout被行緩衝(參見isatty(3))。因此,如果printf格式字符串以\n結尾,則會發生寫入。

您可以在while循環之前添加fflush(stdout);fflush(NULL);呼叫。

fflush(3)setvbuf(3)

如果不刷新stdout(無論是在格式化字符串一個\n,或明確直通fflushfclose)緩衝區只在main末刷新(將向您介紹一些隱atexit(3) ...)

那麼,什麼是發生在你的是,(沒有\n)數據保持在stdout緩衝區,實際寫入(由write(2)stdio庫)只在你的程序退出。

閱讀advanced linux programming

+0

@ Basile:謝謝。我從你的擴展答案中得到了答案。很好的解釋。 – hssay 2013-05-11 07:49:15