2017-06-13 14 views
0

我編寫了下面一段代碼來模擬回調。但是,這卡住了,甚至沒有打印「主要內部」。我在我的unix機器上以及在線編譯器上嘗試了這一點,但行爲相同。我錯過了什麼?簡單的帶有睡眠的c代碼在執行後不會輸出

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

void sleep_50sec() 
{ 
    printf("inside sleep_50sec"); 

    sleep(50); 

} 

int main() 
{ 
    int i; 
    printf("inside main"); 
    sleep(1); 

    for(i =0; i < 100;i++) 
    { printf("Loop %d",i); 
     sleep_50sec(); 
    } 
return 0; 
} 

輸出

[email protected]> ./a.out 
+0

是否執行完畢或者它掛起:它可以通過'\n'字符格式字符串內或由fflush命令來完成? –

+3

'printf'在看到換行符'\ n'時被刷新到'stdout'。追加到你的'printf'調用,你應該看到一些打印輸出。 – yano

+0

@yano假設你沒有繼承設置爲'_IOFBF'的'stdout'。 –

回答

3

打印到stdout時添加\n

printf("inside main\n"); 

需要一個\n的原因是因爲printf刷新數據stdout\n後到達。

您可以打印到stderr立即看到你的數據,而無需使用\n

fprintf(stderr, "test"); 

順便說一句,呼籲printf()輸出時,將被寫入stdout。因此printf(...)fprintf(stdout, ...)相同

+1

與*一些*解釋,這可能是一個很好的答案。 –

+0

這也是我的thrick。 – Akira

0

您看不到任何打印內容的原因是因爲crt(C運行時)會緩衝您的輸出,並且只會在K個字符累積後輸出到屏幕。一種解決方案是使用'\ n' - 這提示crt已經寫完整行,並且它將打印到屏幕上。另一種解決方法是將下面的示例所示隱含刷新stdout,如:

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

void sleep_50sec() 
{ 
    printf("inside sleep_50sec"); 
    fflush(stdout); 

    sleep(50); 

} 

int main() 
{ 
    int i; 
    printf("inside main"); 
    fflush(stdout); 
    sleep(1); 

    for(i =0; i < 100;i++) 
    { printf("Loop %d",i); 
     fflush(stdout); 
     sleep_50sec(); 
    } 
return 0; 
} 
+0

這是您的C運行時控制緩衝區。 –

+0

@FelixPalmen正確,固定 –

+0

@IshayPeled您如何「沖洗」CRT?我認爲你的意思是'標準輸出',這是明顯的沖洗不隱式沖洗。 –

0

你必須沖洗stdout

void sleep_50sec() { 
    printf("inside sleep_50sec"); 
    fflush(stdout); 
    sleep(50); 
}