一、訊號相關概念
1.實際執行訊號的處理動作稱為訊號遞達(delivery).
2.訊號從產生到遞達之間的狀態稱為訊號未決(pending)。(不一定會立即delivery)
3.程序可以選擇阻塞(block)某個訊號。(不會遞達)
4.被阻塞的訊號產生時將保持在未決狀態,知道程序解除對此訊號 的阻塞,才會執行遞達。
5.阻塞和忽略時不同的,訊號被阻塞就不會遞達,忽略是在遞達之後,可選的一種處理動作。
二、在核心中的表示
該圖中,每一行代表著一種訊號,每乙個程序pcb中都有乙個訊號的指標,分別由3個表控制乙個訊號,
1.block點陣圖:表示每種訊號是否被阻塞,0表示沒有被阻塞,1表示被阻塞。
2.pending點陣圖:表示每種訊號的未決狀態,1表示該訊號已經已經產生,但還未遞達。0表示訊號沒有產生,或者產生後已經遞達了,此時該標誌位也變為0。
3.handler表:實際是一函式指標陣列,陣列每個元素對應處理該訊號的函式指標。如果是sig_del表示自行預設處理動作,如果是sig_ign表示忽略該訊號,如果是使用者自定義處理動作,則儲存的是自定義函式的指標。
所以,傳送訊號就可以描述為:作業系統修改程序pcb中pending表中將0變為1.
三、訊號集與操作函式
1.sigset_t:未決和阻塞標誌可以用相同的資料型別sigset_t來儲存。這個型別可以表示每個訊號有效或者無效狀態。在阻塞訊號中有效、無效代表著是否被阻塞,未決也是同樣額,同時,阻塞訊號集也稱為當前程序的訊號遮蔽字。
2.訊號集操作函式:
#includeint sigemptyset(sigset_t* set);
該函式的功能是使set所指向的訊號集變數的所有位元位清零,比如set所指向的是當前程序的阻塞訊號集,所以在該程序中的所有訊號都處於未遮蔽狀態。
int sigfillset(sigset_t* set);
該函式的功能是使set所指向的訊號集變數的所有位元位均變為1。比如set所指向的是當前程序的阻塞訊號集,所以在該程序中的所有訊號都處於遮蔽狀態。
int sigaddset(sigset_t *set,int signo);
該函式的作用是在set所指向的訊號集中使signo訊號變為有效訊號。
int sigdelset(sigset_t* set,int signo);
該函式的作用是在set所指向的訊號集中使signo訊號變為無效訊號。
int sigismember(const sigset_t* set,int signo);
該函式的作用是判斷set所指向的訊號集中signo訊號是否有效。
以上都是成功返回0,失敗返回-1。
四、sigprocmask
呼叫函式sigpromask可以讀取程序或者更改程序的訊號遮蔽字。
int sigprocmask(int how,const sigset_t* set,sigset_t* oset);
引數:
oset:如果該引數非空,相當於儲存該程序原本的訊號遮蔽字。
set:如果該引數非空,則將根據how和set修改該程序的訊號遮蔽字
how:有以下三種
sig_block:此時set中包含的是我們希望新增到當前訊號遮蔽字中的訊號,相當於mask = mask|set
sig_unblock:此時set中包含的是我們希望從當前訊號遮蔽字中解除的訊號,相當於mask = mask&~set
sig_setmask:設定當前訊號遮蔽字為set所指向的值,即mask = set。
返回值:成功返回0,失敗返回-1
五、sigpending
sigprocmask告訴我們如何對阻塞訊號字進行讀取和修改,那sigpending將會使我們讀取程序的未決訊號集。
int sigpending(sigset_t* set);
讀取程序的未決訊號集,通過set引數傳出。成功為0,失敗-1.
#include#include#includevoid printfsigset(sigset_t *set)
else
}printf("\n");
}int main()
return 0;
}
如果執行了這個**,發現用ctrl+c 不能傳送訊號退出程序,想要退出的話,找到這個程序的pid,kill掉就行。 Linux程序操作 訊號及訊號處理 訊號的基礎
訊號的影響 linux下有五種方式產生訊號 對於乙個訊號,linux環境下的程序只有三種處理方式 訊號的到來會中斷程序,使得程序跳轉到訊號處理程式處執行,然後繼續執行該程序的其他部分。如果在訊號到來的時候正在執行系統呼叫,則該系統呼叫會被中斷,當訊號處理程式返回時,系統會重新啟動系統呼叫。使用sig...
Linux 程序訊號
概念 訊號是程序之間事件非同步通知的一種方式,屬於軟中斷。訊號處理常見方式 忽略此訊號。執行該訊號的預設處理動作。提供乙個訊號處理函式,要求核心在處理該訊號時切換到使用者態執行這個處理函式,這種方式稱為捕捉 catch 乙個訊號。產生訊號 捕捉訊號 核心如何實現訊號的捕捉 如果訊號的處理動作是使用者...
Linux程序訊號
訊號是乙個軟體中斷。作業系統通過訊號告訴程序發生了某個事件,打斷程序當前的操作,去處理這個事件。1.訊號的檢視kill l 檢視系統中的訊號種類在linux作業系統中,一共有62中訊號。34 64號訊號 後期擴充的,因為沒有具體對應事件,因此命名比較草率 可靠訊號。訊號的生命週期 產生 在程序中註冊...