2012-11-26 58 views
5

當包括unistd.h睡眠功能的程序無限期掛起:ç休眠功能不能正常工作

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

int main() 
{ 
     int i; 
     printf("0 "); 
     for(i = 1; i <20; ++i) 
     { 
      sleep(2); 
      printf("%d ", i); 
     } 
     printf("\n"); 

     return 0; 
} 

休息時sleep(2)被註釋掉運行正常,任何想法?

+0

另請注意,printf(「0」)行不會運行,所以它不是sleep()中的時間問題。 –

+2

緩衝?如果用換行符結束打印的字符串會發生什麼?編輯:按我的預期工作,靜默38秒,然後打印數字。 –

+2

如果在每次迭代中執行'fflush(stdio);'會發生什麼? –

回答

8

這沒有什麼錯代碼的,但要注意的是,在許多情況下,printf輸出緩存,這意味着出現在控制檯上的輸出只有在你顯式調用fflush(stdout),你打印一個換行符,或緩衝區已滿。由於直到最後纔打印換行符,因此您將在for循環中看到40秒內沒有任何內容(因爲printf打印的內容仍在緩衝區中)。然後,當執行命中printf("\n")時,所有內容都將在緩衝區刷新時立即打印。

因此,底線是:在調用sleep之前調用fflush(stdout)以確保沒有任何內容保留在輸出緩衝區中,或者等待40秒,最後您將在一個批處理中獲得輸出。

0

你在Windows電腦上?如果是這樣,包括在你的程序,並暫停節目,寫

Sleep(time_in_milliseconds) 

凡在你的情況下time_in_milliseconds應該是2000年

在另一方面,如果你是一個基於UNIX的計算機上,代碼看起來很好。

3

hangs indefinitely暗示它卡住或不確定,而且不會發生。你的代碼工作正常38秒(19 * 2)它轉儲字符串從0到19。不過,我懷疑這是你正在尋找它做計數後:

int main() 
{ 
     int i; 
     printf("0 "); 
     fflush(stdout); // Force the output to be printed 
     for(i = 1; i <20; ++i) 
     { 
      sleep(2); 
      printf("%d ", i); 
      fflush(stdout); // Force the output to be printed 
     } 
     printf("\n"); 

     return 0; 
} 

stdout流緩衝和只在它遇到換行符'\n'時纔會顯示,或者如果您想以您的調用printf()的形式「實時」查看它,則需要強制它以這種或那種方式刷新緩衝區。致電fflush(stdout)將執行此操作。

+0

猜測這對我來說是不耐煩的。 –

+0

@JamesJenkinson - :)它發生了。調試器對此很好,所以你可以看到它正在做一些事情,缺乏這些,只是等待它可以睡眠的最大時間() – Mike