1.這段**注意的地方:
alarm() 函式不是阻塞函式,定時之後,程式會繼續往下執行;
pause() 阻塞函式,函式被呼叫呼叫後,主動造成程式掛起。
2.這個地方很容易想歪;當時的問題是這樣:
加入該程式在 執行完38 後失去cpu資源,那麼當它再次獲得cpu資源時且訊號已經發出,程式會不會喚醒,答案是不會。
因為,alarm()函式採用自然定時法,當時間到後,訊號已經由核心發出,假設此後程式才獲得cpu資源,一開始,核心會先進行訊號的處理,處理完訊號後,再調起
pause()函式,這時因為訊號已經發過並且處理完畢,它不會接收到訊號,不會被喚醒,造成程式永久掛起。
當時的理解是這樣,訊號的處理與傳送一直是由核心進行處理的, 不管pause函式呼叫與否;
1.所以,假如pause函式不呼叫,它就不會接收到訊號, 不會被喚醒;
2.加入發出訊號時,pause函式被系統呼叫,它就會接收到訊號,被喚醒。
3.alarm函式呼叫後,程式會繼續往下執行,不會停止,這個一定得理解正確。
1 #include2 #include3 #include4 #include5 #include67 unsigned int mysleep(unsigned int
seconds);
8void do_sth(int
a);9
int main(int argc, char*argv)
1016
//永久睡眠,每隔n妙醒一次;
17while(1)18
22return0;
23}2425 unsigned int mysleep(unsigned int
seconds)
2645
46 unusetime = alarm(0); //
返回剩餘的時間
4748 sigaction(sigalrm, &oldact, null); //
設定捕捉函式
49return
unusetime;
5051}52
53void do_sth(int
a)54
實現睡眠函式mysleep
1.普通版本的 mysleep 函式 有 bug 存在 執行結果如下 我們可以發現當我們的 執行以後,螢幕上輸出很多的 using mysleep sleep 而且在最後一行每隔三秒列印一次,且一直列印直到我們強制停止。審視 mysleep 程式,設想這樣的時序 註冊 sigalrm 訊號的處理函式...
strcpy 函式自實現
strcpy 這個函式應該是每個人經常用到的了,今天,我們就自己來實現一下這個函式 int main void 如上,先把整體的框架定好,接著開始寫my strcpy函式 char my strcpy char dest,const char src const使src不能做左值,防止while裡d...
strcmp 函式自實現
今天繼續來模擬實現庫函式 strcmp 寫my str cmp 函式之前,先了解一下它的定義 strcmp c c 函式,比較兩個字串 設這兩個字串為str1,str2,若str1 str2,則返回零 若str1 str2,則返回正數 若str1 str2 時返回乙個正數就好,具體這個數字是幾,是無...