sleep的可靠實現(APUE)

2022-03-08 03:58:16 字數 721 閱讀 4418

sleep使程序一直掛起,直到滿足一下兩個條件之一:

1、睡眠時間到時;

2、呼叫程序捕捉到乙個訊號,並從該訊號處理函式返回;

以下是apue中實現sleep函式的原始碼,坑爹的我看了半天才明白,受傷。

1 #include "

apue.h

"2 #include 34

static

void

5 sig_alrm(int signo)6 9

10 unsigned int

11 sleep(unsigned int nsecs)

12

函式sig_alrm的作用僅僅是返回到sigsuspend,所以空函式體就行了。整個函式框架,首先阻塞sigalrm訊號,注意是阻塞而不是忽略,這是為了防止當執行其他訊號處理函式時,sigalrm打斷執行過程。然後設定sigalrm訊號處理函式,僅僅是空函式體,為了sigsuspend函式的返回,然後開啟定時器,呼叫alarm函式,此時需要保證sigalrm並沒有阻塞,否則的話,整個函式就失去意義,即使時間到了,因為sigsuspend阻塞了sigalrm訊號,是程序一直掛起(當然沒有其他訊號到來),sigsuspend返回之後,可能是sig_alrm返回(即時間到,前文第一種情況),也可能是程序捕捉到乙個訊號,並從該訊號處理函式返回(前文第二種情況),記下此時的剩餘時間。然後取消對sigalrm的阻塞,重設訊號處理函式。

看了很久才知道是這麼個意思。失敗。

sleep實現原理

a sleep linux中並沒有提供系統呼叫sleep sleep 是在庫函式中實現的,它是通過呼叫alarm 來設定報警時間,呼叫sigsuspend 將程序掛起在訊號sigalarm上,sleep 只能精確到秒級上。b nanosleep 則是linux中的系統呼叫,它是使用定時器來實現的,該...

sleep實現原理

使用者程式中的睡眠 sleep usleep nanosleep sleep 和nanosleep 都是使程序睡眠一段時間後被喚醒,但是二者的實現完全不同。linux中並沒有提供系統呼叫sleep sleep 是在庫函式中實現的,它是通過呼叫alarm 來設定報警時間,呼叫sigsuspend 將程...

lua中的sleep實現

這篇文章主要介紹了lua中實現sleep函式功能的4種方法,本文講解了在乙個死迴圈中設定乙個跳出條件方法 呼叫系統的sleep函式法 windows下ping命令法 socket庫中select函式法4種方法,需要的朋友可以參考下 乙個不幸的訊息是lua中沒有內建sleep函式,我們需要diy。有4...