2010-03-10 40 views
2
#include<stdio.h> 
#include<signal.h> 
#include<stdlib.h> 
void handler(int signo) 
{ 
    printf("First statement"); 
    system("date"); 
    exit(EXIT_SUCCESS); 
} 

int main() 
{ 
    signal(SIGINT,handler); 
    printf("Waiting for KeyboardInterrupt\n"); 
    for(;;); 
    return 0; 
} 

試運行: -標準緩衝沒有得到清除系統()調用之前

[email protected]:~/c$ gcc main.c 
[email protected]:~/c$ ./a.out 
Waiting for KeyboardInterrupt 
^CWed Mar 10 23:55:47 IST 2010 
First [email protected]:~/c$ 

爲什麼「首先聲明」系統後得到印刷()調用?

回答

3

標準輸入,你的進程啓動時創建的輸出和錯誤流,在這個例子中是你的C程序。在進行系統調用時,將創建另一個進程來執行date命令,並獲取它自己的一組流。

在您的程序中,printf輸出緩衝到C程序的標準輸出流。然後將日期的輸出緩衝到其自己的標準輸出流。當系統調用結束時,日期標準輸出流將被刷新,以便您看到輸出。然後,當你的C程序結束時,它的標準輸出流被刷新,你會看到printf輸出。

你可能會覺得這個傢伙的貼子很有用:http://www.pixelbeat.org/programming/stdio_buffering/

+0

多數民衆贊成在我想.. :) – 2010-03-10 19:05:16

2

您是否在調用系統(「date」)之前嘗試刷新緩衝區?

我剛剛在system之前加fflush(NULL);,輸出如預期。

+0

婭。我知道這一點..但是,我仍然從@Mike得到了正確的解決方案.. – 2010-03-10 19:02:47

+0

'fflush(NULL)'刷新* ALL *緩衝區,所以誰有哪個緩衝區並不重要。用特定的參數刷新只有該緩衝區。 – rmk 2010-03-10 19:37:37

1

C IO API將緩衝區以提高打印效率。通常情況下,只要您寫出換行符或手動刷新緩衝區,就會刷新緩衝區。

所以,你可以使用一個換行符,刷新緩衝區:

printf("First statement\n"); 

或者使用fflush函數:

printf("First statement"); 
fflush (stdout); 
+1

添加「\ n」並不總是(例如,如果stdout被重定向到文件)。 'fflush'會。 – 2010-03-10 18:36:20

+0

其實,我新發生了這種情況..但是,正如我所說的@Mike,我知道STDOUT沒有被刷新bcos「date」命令有另一個STDOUT流.. – 2010-03-10 19:00:44