「信號機制」簡述Linux信號

轉載請保留出處:https://blog.csdn.net/jinixin/article/details/80382331

 

工作中再次接觸到了Linux信號,以前認爲由於離底層比較遠,信號沒什麼用,但這次發現其的一個用途,故打算在此做個簡單記錄。

記錄共有三篇,本文是開篇,簡單介紹Linux信號;第二篇介紹Python語言中負責信號處理的signal模塊,並給出一些demo;第三篇則介紹信號的一個應用。三篇組成一個系列,想起拋磚引玉的作用,希望對大家能有所幫助。

 

 

什麼是信號

 

信號是操作系統和程序間通信的一種方式,程序監聽信號,並在收到信號後按照既定指示進行下一步操作,信號可由操作系統或其他應用程序發出。

操作系統爲每個信號都設計好了默認操作,而我們通過編程可以代替系統先前設定的操作,或直接要求程序忽略某些信號。

因此程序在接收到信號後,可能會按系統既定的默認操作執行,也可能會忽略該信號,或者使用我們編寫的替代方案。但有些信號是不可被替換的,具體下面會提到。

 

 

如何發信號

 

1)kill -l

顯示系統所支持的信號名列表

 

2)kill [-signal] 進程號

給指定進程發送一個信號

其中signal爲可選項,其值爲“信號編號”或“SIG+信號名”,缺省時默認發送TERM信號。個人推薦用“SIG+信號名”的組合,因爲不同操作系統中信號編號可能不一致,但信號名往往是一樣的。

舉例:先使用tree命令在後臺打印當前目錄結構,通過ps命令找到其進程號,使用kill命令向其發送終止信號TERM

 

3)killall [-user] [-signal] 進程名

給多個進程發送一個信號

其中user與signal均爲可選參數,signal上面已經介紹過,user則指定了作用於該用戶下的進程。

 

使用“kill*”操作需注意,和文件一樣,進程也有所有者,只有進程的所有者或超級用戶才能使用kill命令來給進程發信號。

 

 

常用信號

 

Mac可通過“man signal”命令打印系統所支持的信號量,包括信號名和所對應的信號編號。不同的操作系統,信號名是一樣的,但信號編號可能不一致,下面是Mac系統的幾個常用信號量。

 

1)信號名:HUP,信號編號:1

掛起信號,用於終止進程。當用戶關閉終端時發出該信號,通知同個session內各進程退出。該信號也被很多後臺程序用來平滑重啓,如Apache服務器接收到該信號後會重新初始化服務。

 

2)信號名:INT,信號編號:2

中斷信號,用於終止進程,用戶鍵入「CTRL-C」時發出該信號。

 

3)信號名:QUIT,信號編號:3

退出信號,用於終止進程,退出程序運行,用戶鍵入「CTRL-\」時發出該信號。

 

4)信號名:KILL,信號編號:9

殺死信號,用於終止進程,立即結束程序執行。

程序接收到該信號後立即停止執行,不做任何清理或保存工作,該信號不可被替代或忽略。其實該信號不會真正的發送給目標程序,而是內核自己終止了對應進程。該信號建議只在其他信號都執行無效的情況下使用

 

5)信號名:TERM,信號編號:15

終止信號,用於終止進程,要求程序結束執行。

程序接收到該信號後可執行清理,保存完畢後再退出,該信號可被替換或忽略。shell中的kill命令,默認發出該信號。

 

6)信號名:ALRM,信號編號:14

時鐘定時信號,計算的是時鐘時間。

 

7)信號名:VTALRM,信號編號:26

時鐘定時信號,計算的是進程實際使用CPU的時間。

 

8)信號名:CHLD,信號編號:19

子進程結束後,父進程會收到該信號。若父進程未處理該信號,或沒有等待子進程。子進程雖然終止,但仍會在內核進程表中佔有表項,此時子進程被稱爲殭屍進程

 

9)信號名:STOP,信號編號:17

暫停信號,用於暫停進程,該信號不可被替代或忽略。

 

10)信號名:TSTP,信號編號:18

終端暫停信號,用於暫停進程,用戶鍵入「CTRL-Z」時發出該信號。

 

11)信號名:USR1,信號編號:30

用戶自定義信號1

 

12)信號名:USR2,信號編號:31

用戶自定義信號2

 

對於絕大多數的信號,操作系統已爲我們定義好了程序在接收後的默認操作。如果我們想自己重新定義程序接收信號後的操作,可以看這篇博客,那裏將使用Python的signal模塊做一些小demo。

 

文中如有不當之處,還望包容和指出,感謝~

 

參考自:《Linux命令行大全》第10章

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章