第乙個版本:
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...