sleep()封裝函式
最近在做專案中,由於對sleep() 函式及其封裝函式掌握不透徹,導致本來延時10s,結果延時10ms,導致功能概論出現異常;現將linux sleep() 函式總結如下:
1. windows下sleep的引數為毫秒 ,所以sleep(1000) 代表延遲1秒;
Linux下 sleep的引數為秒,所以延遲1秒為 sleep(1);
2. 相關函式:signal, alarm
標頭檔案:#include<stdio.h>
定義函式:unsigned int sleep(unsigned int seconds);
函式說明:sleep()會令目前的程序暫停, 直到達到引數seconds 所指定的時間, 或是被訊號所中斷.
返回值:若程序/執行緒掛起到引數所指定的時間則返回0,若有訊號中斷則返回剩餘秒數。
如果需要更精確可以用usleep單位為微秒
執行緒休眠函式:void usleep(unsigned long usec);
linux下delay()函式:
原型為extern void delay(unsigned int msec); 它可以延時msec*4毫秒,也就是如果想延時一秒鐘的話,可以這麼用 delay(250);
綜上所述:sleep,類似使當前程序睡眠,即就是將程序掛起,不再佔用CPU(自動放棄CPU)。 這裡sleep是為了讓子程序在父程序之後執行,試想如果子程序先執行完了,父程序就會永遠阻塞在waitpid函式,等待那個已經結束的子程序。
在linux程式設計中,定時功能,常見的是用sleep(time)函式來睡眠time秒;但是這個函式是可以被中斷的,也就是說當程序在睡眠的過程中,如果被中斷,那麼當中斷結束回來再執行該程序的時候,該程序會從sleep函式的下一條語句執行;這樣的話就不會睡眠time秒了;
例項如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
從執行結果可以看出,當我按下Ctrl+c發出中斷的時候,被該函式捕獲,當處理完該訊號之後,函式直接執行sleep下面的語句;備註:sleep(time)返回值是睡眠剩下的時間;
下面的例子是真正的睡眠time時間(不被中斷影響):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
備註:其中recevie the signal is 2.表示該訊號是中斷訊號;訊號的具體值如下圖所示:
最後是sleep函式的man手冊,命令為:man 3 sleep