自定義實現mysleep

2022-09-03 01:57:11 字數 2002 閱讀 1629

今天偶爾發現乙個函式,很神奇,當我在考慮其用途時,靈光一現!突然好像明白了sleep底層的實現機制,因此我準備利用此函式來模擬實現一下自己的sleep函式!

#includeint pause(void);

當該函式被呼叫時,程序會自動被掛起,直到有訊號遞達!

如果收到的訊號的動作是結束程序,那麼程序將會被結束.

如果該訊號處理動作是忽略,那麼該程序會繼續被掛起.

如果該訊號處理動作是捕捉的自定義方法,該函式返回-1.

乍一看,感覺這個函式屁用沒有!但如果結合下面這個函式:

#includeint alarm(unsigned int seconds);

該函式可以設定乙個鬧鐘,表示在seconds秒之後作業系統將會給該程序傳送乙個sigalrm訊號.

該函式返回值為0,或者剩餘的秒數.

如果該函式引數為0,則表示取消原有鬧鐘,並返回原鬧鐘的剩餘時間.

有了這兩件"法寶",想實現自己的sleep函式簡直是手到擒來,大致思考一下,寫出**如下:

#include#includevoid handler(int sig)

//(不完善版)函式執行完畢後,出現sigalrm的訊號,都變成自定義操作了

int mysleep1(unsigned int scds)

看著這樣的**,執行起來好像沒什麼問題,但略微思考一下,就會發現:sigalrm訊號預設操作已經變成捕捉的自定義操作了,函式執行完後,sigalrm訊號沒有恢復到預設操作.

因此,在捕捉訊號的"**",不得不公升級一下了!

#includeint sigaction(int signo,const struct sigaction *act,struct sigaction *oact);

signo:訊號

act:要採取的操作

oact:輸出型引數,原有的操作(可為null)

struct sigaction

這個函式的優點在於,你修改訊號捕捉函式後,它有乙個輸出型引數,把原有的設定備份了乙份.因此,當我們程式執行結束時,可以將原有訊號處理恢復.

#include#include#includevoid handler(int sig)

int mysleep2(unsigned int scds)

然而,在這種情況下,該程式還是存在bug.

如果alarm函式執行完畢後,該程序被切出去,cpu去處理了優先順序更高的程序,然後再切回該程序時,有可能出現計時已經結束的場景.

那麼pause便會該程序一直掛起!!!!

要想解決這個問題,我們又得公升級**!

#includeint sigsuspend(const sigset_t *sigmask);

這個函式是pause函式的公升級版,呼叫該函式時,程序的訊號遮蔽字由引數sigmask指定,可以通過指定sigmask引數來解除對某個訊號的遮蔽,然後掛起等待.

為了解決競態條件的問題,我們需要再次對程式進行公升級!

#include#include#includevoid handler(int sig)

int mysleep3(unsigned int scds)

////////////////////////////////////

//檔案說明:mysleep.c

//開發環境:kali linux/g++ v6.3.0

////////////////////////////////////

#include#include#includevoid handler(int sig)

int mysleep3(unsigned int scds)

int mysleep2(unsigned int scds)

int mysleep1(unsigned int scds)

int main()

return 0;

}

自定義Toast實現自定義Toast布局

平時我們使用toast的時候都是這樣的一種方法 toast toast toast.maketext context,duration 現在我們來自定義下toast的布局,首先看下toast建立時的源 public static toast maketext context context,char...

實現自定義IFormattable

using system using system.collections using system.linq using system.text using system.collections.generic using system.runtime.serialization namespac...

自定義tabcontrol實現

using system using system.collections generic using system.drawing using system.linq using system.text using system.windows forms namespace shengxinso...