Linux訊號基礎

來源:互聯網
上載者:User

作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝!

 

Linux進程基礎一文中已經提到,Linux以進程為單位來執行程式。我們可以將電腦看作一個大樓,核心(kernel)是大樓的管理員,進程是大樓的房客。每個進程擁有一個獨立的房間(屬於進程的記憶體空間),而每個房間都是不允許該進程之外的人進入。這樣,每個進程都只專註於自己乾的事情,而不考慮其他進程,同時也不讓別的進程看到自己的房間內部。這對於每個進程來說是一種保護機制。(想像一下幾百個進程總是要幹涉對方,那會有多麼混亂,或者幾百個進程相互偷窺……)

 

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

 

給我一個訊號

 

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

 

1. 常見訊號

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

$man 7 signal

來查閱更多的訊號。

 

上面幾個訊號中,

SIGINT   當鍵盤按下CTRL+C從shell中發出訊號,訊號被傳遞給shell中前台啟動並執行進程,對應該訊號的預設操作是中斷 (INTERRUPT) 該進程。

SIGQUIT  當鍵盤按下CTRL+\從shell中發出訊號,訊號被傳遞給shell中前台啟動並執行進程,對應該訊號的預設操作是退出 (QUIT) 該進程。

SIGTSTP  當鍵盤按下CTRL+Z從shell中發出訊號,訊號被傳遞給shell中前台啟動並執行進程,對應該訊號的預設操作是暫停 (STOP) 該進程。

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

SIGALRM  起到定時器的作用,通常是程式在一定的時間之後才產生該訊號。

 

2. 在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進程。

 

3. 訊號處理 (signal disposition)

在上面的例子中,所有的訊號都採取了對應訊號的預設操作。但這並不絕對。當進程決定執行訊號的時候,有下面幾種可能:

1) 無視(ignore)訊號,訊號被清除,進程本身不採取任何特殊的操作

2) 預設(default)操作。每個訊號對應有一定的預設操作。比如上面SIGCONT用於繼續進程。

3) 自訂動作。也叫做擷取 (catch) 訊號。執行進程中預設的對應於該訊號的操作。

進程會採取哪種操作,要根據該進程的程式設計。特別是擷取訊號的情況,程式往往會設定一些比較長而複雜的操作(通常將這些操作放到一個函數中)。

 

實際上,訊號由於常常被用於系統管理,所以它的內容相當龐雜。深入瞭解訊號需要一定的對於Linux環境編程的知識,這裡只是概括。

 

總結:

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

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

$kill

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.