Linux信號基礎

Linux以進程爲單位來執行程序。咱們能夠將計算機看做一個大樓,內核(kernel)是大樓的管理員,進程是大樓的房客。每一個進程擁有一個獨立的房間(屬於進程的內存空間),而每一個房間都是不容許該進程以外的人進入。這樣,每一個進程都只專一於本身乾的事情,而不考慮其餘進程,同時也不讓別的進程看到本身的房間內部。這對於每一個進程來講是一種保護機制。(想像一下幾百個進程老是要干涉對方,那會有多麼混亂,或者幾百個進程相互偷窺……) shell

然而,在一些狀況,咱們須要打破封閉的房間,以便和進程交流信息。好比說,內核發現有一個進程在砸牆(硬件錯誤),須要讓進程意識到這樣繼續下去會毀了整個大樓。再好比說,咱們想讓多個進程之間合做。這樣,咱們就須要必定的通訊方式。信號(signal)就是一種向進程傳遞信息的方式。咱們能夠將信號想象成大樓的管理員往房間的信箱裏塞小紙條。隨後進程取出小紙條,會根據紙條上的內容來採起必定的行動,好比燈壞了,提醒進程使用手電。(固然,也能夠徹底無視這張紙條,然而在失火這樣緊急的情況下,無視信號不是個好的選擇)。相對於其餘的進程間通訊方式(interprocess communication, 好比說pipe, shared memory)來講,信號所能傳遞的信息比較粗糙,只是一個整數。但正是因爲傳遞的信息量少,信號也便於管理和使用。信號所以被常常地用於系統管理相關的任務,好比通知進程終結、停止或者恢復等等。 編程

信號是由內核(kernel)管理的。信號的產生方式多種多樣,它能夠是內核自身產生的,好比出現硬件錯誤(好比出現分母爲0的除法運算,或者出現segmentation fault),內核須要通知某一進程;也能夠是其它進程產生的,發送給內核,再由內核傳遞給目標進程。內核中針對每個進程都有一個表存儲相關信息(房間的信箱)。當內核須要將信號傳遞給某個進程時,就在該進程相對應的表中的適當位置寫入信號(塞入紙條),這樣,就生成(generate)了信號。當該進程執行系統調用時,在系統調用完成後退出內核時,都會順便查看信箱裏的信息。若是有信號,進程會執行對應該信號的操做(signal action, 也叫作信號處理signal disposition),此時叫作執行(deliver)信號。從信號的生成到信號的傳遞的時間,信號處於等待(pending)狀態(紙條尚未被查看)。咱們一樣能夠設計程序,讓其生成的進程阻塞(block)某些信號,也就是讓這些信號始終處於等待的狀態,直到進程取消阻塞(unblock)或者無視信號。 函數

常見信號

信號所傳遞的每個整數都被賦予了特殊的意義,並有一個信號名對應該整數。常見的信號有SIGINT, SIGQUIT, SIGCONT, SIGTSTP, SIGALRM等。這些都是信號的名字。你能夠經過 spa

$man 7 signal


來查閱更多的信號。

上面幾個信號中, 設計

SIGINT   當鍵盤按下CTRL+C從shell中發出信號,信號被傳遞給shell中前臺運行的進程,對應該信號的默認操做是中斷 (INTERRUPT) 該進程。 code

SIGQUIT  當鍵盤按下CTRL+\從shell中發出信號,信號被傳遞給shell中前臺運行的進程,對應該信號的默認操做是退出 (QUIT) 該進程。 進程

SIGTSTP  當鍵盤按下CTRL+Z從shell中發出信號,信號被傳遞給shell中前臺運行的進程,對應該信號的默認操做是暫停 (STOP) 該進程。 ip

SIGCONT  用於通知暫停的進程繼續。 內存

SIGALRM  起到定時器的做用,一般是程序在必定的時間以後才生成該信號。 it

在shell中使用信號

下面咱們實際應用一下信號。咱們在shell中運行ping:

$ping localhost


此時咱們能夠經過CTRL+Z來將SIGTSTP傳遞給該進程。shell中顯示:
[1]+  Stopped                 ping localhost


咱們使用$ps來查詢ping進程的PID (PID是ping進程的房間號), 在個人機器中爲27397

咱們能夠在shell中經過$kill命令來向某個進程發出信號:

$kill -SIGCONT  27397

來傳遞SIGCONT信號給ping進程。

信號處理 (signal disposition)

在上面的例子中,全部的信號都採起了對應信號的默認操做。但這並不絕對。當進程決定執行信號的時候,有下面幾種可能:

1) 無視(ignore)信號,信號被清除,進程自己不採起任何特殊的操做

2) 默認(default)操做。每一個信號對應有必定的默認操做。好比上面SIGCONT用於繼續進程。

3) 自定義操做。也叫作獲取 (catch) 信號。執行進程中預設的對應於該信號的操做。

進程會採起哪一種操做,要根據該進程的程序設計。特別是獲取信號的狀況,程序每每會設置一些比較長而複雜的操做(一般將這些操做放到一個函數中)。

信號經常被用於系統管理,因此它的內容至關龐雜。深刻了解信號,須要必定的Linux環境編程知識。

總結

信號機制; generate, deliver, pending, blocking

signal action/dispositon; ignore, default action, catch signal

$kill

相關文章
相關標籤/搜索