Linux中的mysleep函式

2021-07-31 06:39:40 字數 1062 閱讀 6686

第乙個版本:

1、 main函式呼叫mysleep函式,後者呼叫sigaction註冊了sigalrm訊號的處理函式handler。

2、呼叫alarm(timeout)設定鬧鐘。

3、呼叫pause等待,核心切換到別的程序執行。

4、timeout秒之後,鬧鐘超時,核心發sigalrm給這個程序。

5、從核心態返回這個程序的使用者態之前處理未決訊號,發現有sigalrm訊號,其處理函式是handler。

6、切換到使用者態執行handler函式,進入handler函式時sigalrm訊號被自動遮蔽, 從handler函式返回時sigalrm訊號自動解除遮蔽。然後自動執行系統呼叫sigreturn再次進入 核心,再返回使用者態繼續執行程序的主控制流程(main函式呼叫的mysleep函式)。

7、pause函式返回-1,然後呼叫alarm(0)取消鬧鐘,呼叫sigaction恢復sigalrm訊號以前的處理 動作。

**如下:

執行結果(每隔5秒列印一條語句):

上述版本會存在乙個問題,即 在設定鬧鐘(假如3秒)之後被切出去,等過5秒再回來時,就收不到訊號,將會被永遠掛起。

修正版本如下:

1、遮蔽sigalrm訊號;

2、alarm(timeout);

3、解除對sigalrm的遮蔽;

4、pause();

注:在此把解除遮蔽與掛起等待合二為一較好,所以用sigsuspend函式。

**如下:

執行結果(每隔5秒列印一條語句):

linux 模擬實現my sleep的兩個版本

1.既然要講sleep,那麼大家就有必要了解一下什麼是訊號。訊號 是unix程序間通訊的一種標準方式。訊號的產生 1.鍵盤快捷鍵 2.異常 3.作業系統命令和函式 4.鬧鐘 訊號的數量 64種,1 31是普通訊號,34 64是是時時訊號 my sleep版本one 有bug include incl...

mysleep 的兩種實現

mysleep 的兩種實現 一 include include include void myhandler int sig 控制代碼函式什麼也不做 int mysleep int timeout int main return 0 二 避免競態條件的mysleep include include ...

Django中Middleware中的函式詳解

乙個middleware的例子 import time from django.urls import reverse from django.utils.deprecation import middlewaremixin class timeitmiddleware middlewaremixi...