什么是Linux信號(hào)機(jī)制,Linux信號(hào)機(jī)制要講解起來(lái)沒(méi)那么簡(jiǎn)單,本文只是給大家講解下Linux信號(hào)機(jī)制的基礎(chǔ)知識(shí),讓你對(duì)Linux信號(hào)機(jī)制有一些了解,一起來(lái)學(xué)習(xí)下吧 。

Linux進(jìn)程基礎(chǔ)一文中已經(jīng)提到,Linux以進(jìn)程為單位來(lái)執(zhí)行程序 。我們可以將計(jì)算機(jī)看作一個(gè)大樓,內(nèi)核(kernel)是大樓的管理員,進(jìn)程是大樓的房客 。每個(gè)進(jìn)程擁有一個(gè)獨(dú)立的房間(屬于進(jìn)程的內(nèi)存空間),而每個(gè)房間都是不允許該進(jìn)程之外的人進(jìn)入 。這樣,每個(gè)進(jìn)程都只專(zhuān)注于自己干的事情,而不考慮其他進(jìn)程,同時(shí)也不讓別的進(jìn)程看到自己的房間內(nèi)部 。這對(duì)于每個(gè)進(jìn)程來(lái)說(shuō)是一種保護(hù)機(jī)制 。(想像一下幾百個(gè)進(jìn)程總是要干涉對(duì)方,那會(huì)有多么混亂,或者幾百個(gè)進(jìn)程相互偷窺……)
然而,在一些情況,我們需要打破封閉的房間,以便和進(jìn)程交流信息 。比如說(shuō),內(nèi)核發(fā)現(xiàn)有一個(gè)進(jìn)程在砸墻(硬件錯(cuò)誤),需要讓進(jìn)程意識(shí)到這樣繼續(xù)下去會(huì)毀了整個(gè)大樓 。再比如說(shuō),我們想讓多個(gè)進(jìn)程之間合作 。這樣,我們就需要一定的通信方式 。信號(hào)(signal)就是一種向進(jìn)程傳遞信息的方式 。我們可以將信號(hào)想象成大樓的管理員往房間的信箱里塞小紙條 。隨后進(jìn)程取出小紙條,會(huì)根據(jù)紙條上的內(nèi)容來(lái)采取一定的行動(dòng),比如燈壞了,提醒進(jìn)程使用手電 。(當(dāng)然,也可以完全無(wú)視這張紙條,然而在失火這樣緊急的狀況下,無(wú)視信號(hào)不是個(gè)好的選擇) 。相對(duì)于其他的進(jìn)程間通信方式(interprocess communication,比如說(shuō)pipe,shared memory)來(lái)說(shuō),信號(hào)所能傳遞的信息比較粗糙,只是一個(gè)整數(shù) 。但正是由于傳遞的信息量少,信號(hào)也便于管理和使用 。信號(hào)因此被經(jīng)常地用于系統(tǒng)管理相關(guān)的任務(wù),比如通知進(jìn)程終結(jié)、中止或者恢復(fù)等等 。
給我一個(gè)信號(hào)
信號(hào)是由內(nèi)核(kernel)管理的 。信號(hào)的產(chǎn)生方式多種多樣,它可以是內(nèi)核自身產(chǎn)生的,比如出現(xiàn)硬件錯(cuò)誤(比如出現(xiàn)分母為0的除法運(yùn)算,或者出現(xiàn)segmentation fault),內(nèi)核需要通知某一進(jìn)程;也可以是其它進(jìn)程產(chǎn)生的,發(fā)送給內(nèi)核,再由內(nèi)核傳遞給目標(biāo)進(jìn)程 。內(nèi)核中針對(duì)每一個(gè)進(jìn)程都有一個(gè)表存儲(chǔ)相關(guān)信息(房間的信箱) 。當(dāng)內(nèi)核需要將信號(hào)傳遞給某個(gè)進(jìn)程時(shí),就在該進(jìn)程相對(duì)應(yīng)的表中的適當(dāng)位置寫(xiě)入信號(hào)(塞入紙條),這樣,就生成(generate)了信號(hào) 。當(dāng)該進(jìn)程執(zhí)行系統(tǒng)調(diào)用時(shí),在系統(tǒng)調(diào)用完成后退出內(nèi)核時(shí),都會(huì)順便查看信箱里的信息 。如果有信號(hào),進(jìn)程會(huì)執(zhí)行對(duì)應(yīng)該信號(hào)的操作(signal action,也叫做信號(hào)處理signal disposition),此時(shí)叫做執(zhí)行(deliver)信號(hào) 。從信號(hào)的生成到信號(hào)的傳遞的時(shí)間,信號(hào)處于等待(pending)狀態(tài)(紙條還沒(méi)有被查看) 。我們同樣可以設(shè)計(jì)程序,讓其生成的進(jìn)程阻塞(block)某些信號(hào),也就是讓這些信號(hào)始終處于等待的狀態(tài),直到進(jìn)程取消阻塞(unblock)或者無(wú)視信號(hào) 。
常見(jiàn)信號(hào)
信號(hào)所傳遞的每一個(gè)整數(shù)都被賦予了特殊的意義,并有一個(gè)信號(hào)名對(duì)應(yīng)該整數(shù) 。常見(jiàn)的信號(hào)有SIGINT,SIGQUIT,SIGCONT,SIGTSTP,SIGALRM等 。這些都是信號(hào)的名字 。你可以通過(guò)
代碼如下:
$man 7 signal
來(lái)查閱更多的信號(hào) 。
上面幾個(gè)信號(hào)中,
SIGINT 當(dāng)鍵盤(pán)按下CTRL+C從shell中發(fā)出信號(hào),信號(hào)被傳遞給shell中前臺(tái)運(yùn)行的進(jìn)程,對(duì)應(yīng)該信號(hào)的默認(rèn)操作是中斷 (INTERRUPT) 該進(jìn)程 。
SIGQUIT 當(dāng)鍵盤(pán)按下CTRL+\從shell中發(fā)出信號(hào),信號(hào)被傳遞給shell中前臺(tái)運(yùn)行的進(jìn)程,對(duì)應(yīng)該信號(hào)的默認(rèn)操作是退出 (QUIT) 該進(jìn)程 。
SIGTSTP 當(dāng)鍵盤(pán)按下CTRL+Z從shell中發(fā)出信號(hào),信號(hào)被傳遞給shell中前臺(tái)運(yùn)行的進(jìn)程,對(duì)應(yīng)該信號(hào)的默認(rèn)操作是暫停 (STOP) 該進(jìn)程 。
推薦閱讀
- wlan信號(hào)橋是什么
- 孩子將來(lái)不孝順的5個(gè)信號(hào),第二種必須改!
- Linux初學(xué)者學(xué)習(xí)命令有什么意義?
- 什么是Linux系統(tǒng)架構(gòu)?
- Linux文件系統(tǒng)入門(mén)詳解
- 深入理解Linux文本流
- 初次使用Linux系統(tǒng)時(shí)常遇到的問(wèn)題匯總
- 加快Linux文件拷貝速度的兩大方法
- 如何快速清空Linux文件內(nèi)容
- Linux進(jìn)程的相關(guān)知識(shí)介紹
