又有一段時間沒寫了。。
今天看到一句話,「sleep函式在底層是用alarm和pause實現的」,就上網搜了一下,看了好一會兒才明白是怎麼回事。
alarm函式其實就是個定時器,每個程序只能維護乙個這樣的定時器。這個函式是有返回值的,通常是0,如果在乙個alarm還沒結束時就呼叫了另乙個alarm,那麼第二個alarm會替換第乙個,並返回第乙個剩下的秒數。
當alarm函式順利超時時,會發出sigalrm的訊號,如果這個訊號沒有**捉和處理,預設的行為是結束當前呼叫它的程序,我們在程式中可以使用
signal(sigalrm, p_handler);
來重新定義受到sigalrm訊號時的行為,其中p_handler是處理函式,看到這個函式的形式我就想是不是其實所有訊號都可以這樣處理,自己定義,然後一查,果然。
signal函式的原型如下:
void (*signal(int signum,void(* handler)(int)))(int);
signum不用說了,肯定是某個訊號的編號,這個編號其實有個標準,叫posix(portable operating system inte***ce),x表示是對unix api的傳承。這個標準是為在unix跑的程式定義的,但是 其他系統也都有實現,不過編號可能不一樣,所以這裡用的名稱常量。
後面的handler是個函式指標,它接收乙個int引數,並返回void,實際中可以有三種不同的形式:
1. 無返回值的函式指標。
2.sig_ing:會忽略掉這個訊號。
3.sig_dfl:表示恢復系統的預設處理。
這樣我想怎樣實現sleep就有點概念了,先自己定義乙個handler,來處理alarm超時之後的sigalrm訊號。由於alarm函式呼叫後,就像開了乙個子執行緒,主線程會繼續往下執行的,所以要加上pause(),讓主線程停留在那裡就可以了,這樣就實現了sleep休息,休息一下的功能。
訊號之alarm和pause函式
使用alarm函式可以設定乙個計時器,在將來某個指定的時間,該計時器會超時。當計時器超時時,產生sigalrm訊號。如果不忽略或不捕捉此訊號,則其預設動作是終止呼叫該alarm函式的程序。include unsigned int alarm unsigned int seconds 返回值 0或以前...
使用alarm配合訊號實現sleep
author selfimpr blog mail lgg860911 yahoo.com.cn apue中描述solaris 9是使用alarm實現的sleep,其語義如下 如果在sleep之前有乙個未到期的alarm時鐘,則中斷時鐘 下面是乙個簡化的實現,語義為 如果sleep時發現已經有乙個a...
alarm函式的使用
函式定義 unsigned int alarm unsigned int seconds 函式說明 alarm 用來設定訊號sigalrm在經過引數seconds指定的秒數後傳送給目前的程序。如果在alarm函式之前設定過鬧鐘秒數,則以前設定的秒數被新的鬧鐘時間取代。如果引數seconds 為0,則...