![]() |
|||||||||||||||||||||||||||||||||
Linux下的信號(hào)機(jī)制 |
|||||||||||||||||||||||||||||||||
本文關(guān)鍵字: linux 管道通信,linux 進(jìn)程通信方式,信號(hào) 信號(hào)是在軟件層次上對(duì)中斷機(jī)制的一種模擬。在原理上,一個(gè)進(jìn)程收到一個(gè)信號(hào)與處理器收到一個(gè)中斷請(qǐng)求可以說(shuō)是一樣的。信號(hào)是異步的,一個(gè)進(jìn)程不必通過(guò)任何操作來(lái)等待信號(hào)的到達(dá),事實(shí)上,進(jìn)程也不知道信號(hào)到底什么時(shí)候到達(dá)。信號(hào)可以直接進(jìn)行用戶空間進(jìn)程和內(nèi)核進(jìn)程之間的交互,內(nèi)核進(jìn)程也可以利用它來(lái)通知用戶空間進(jìn)程發(fā)生了哪些系統(tǒng)事件。它可以在任何時(shí)候發(fā)給某一進(jìn)程,而無(wú)須知道該進(jìn)程的狀態(tài)。如果該進(jìn)程當(dāng)前并未處于執(zhí)行態(tài),則該信號(hào)就由內(nèi)核保存起來(lái),直到該進(jìn)程恢復(fù)執(zhí)行再傳遞給它為止;如果一個(gè)信號(hào)被進(jìn)程設(shè)置為阻塞,則該信號(hào)的傳遞被延遲,直到其阻塞被取消時(shí)才被傳遞給進(jìn)程。 信號(hào)是進(jìn)程間通信機(jī)制中唯一的異步通信機(jī)制,可以看做是異步通知,通知接收信號(hào)的進(jìn)程有哪些事情發(fā)生了。信號(hào)機(jī)制經(jīng)過(guò)Posix實(shí)時(shí)擴(kuò)展后,功能更加強(qiáng)大,除了基本通知功能外,還可以傳遞附加信息。 信號(hào)事件的發(fā)生有兩個(gè)來(lái)源:硬件來(lái)源(如我們按下了鍵盤(pán)上的按鈕或者出現(xiàn)其他硬件故障);軟件來(lái)源,常用發(fā)送信號(hào)的系統(tǒng)函數(shù)有kill()、raise()、alarm()、setitimer()和sigqueue()等,軟件來(lái)源還包括一些非法運(yùn)算等操作。 進(jìn)程可以通過(guò)3種方式來(lái)響應(yīng)一個(gè)信號(hào)。 1.忽略信號(hào) 忽略信號(hào)即對(duì)信號(hào)不做任何處理,其中,有兩個(gè)信號(hào)不能忽略:SIGKILL和SIGSTOP。 2.捕捉信號(hào) 定義信號(hào)處理函數(shù),當(dāng)信號(hào)發(fā)生時(shí),執(zhí)行相應(yīng)的處理函數(shù)。 3.執(zhí)行默認(rèn)操作 Linux對(duì)每種信號(hào)都規(guī)定了默認(rèn)操作,如表1所示。 表1 常見(jiàn)信號(hào)的含義及其默認(rèn)操作
一個(gè)完整的信號(hào)生命周期可以分為3個(gè)重要階段,這3個(gè)階段由4個(gè)重要事件來(lái)刻畫(huà)的:信號(hào)產(chǎn)生、信號(hào)在進(jìn)程中注冊(cè)、信號(hào)在進(jìn)程中注銷(xiāo)、執(zhí)行信號(hào)處理函數(shù)。這里信號(hào)的產(chǎn)生、注冊(cè)、注銷(xiāo)等是指信號(hào)的內(nèi)部實(shí)現(xiàn)機(jī)制,而不是信號(hào)的函數(shù)實(shí)現(xiàn)。因此,信號(hào)注冊(cè)與否與本節(jié)后面講到的發(fā)送信號(hào)函數(shù)(如kill()等)及信號(hào)安裝函數(shù)(如signal()等)無(wú)關(guān),只與信號(hào)值有關(guān)。 相鄰兩個(gè)事件的時(shí)間間隔構(gòu)成信號(hào)生命周期的一個(gè)階段。要注意這里的信號(hào)處理有多種方式,一般是由內(nèi)核完成的,當(dāng)然也可以由用戶進(jìn)程來(lái)完成,故在此沒(méi)有明確指出。 信號(hào)的處理包括信號(hào)的發(fā)送、捕獲及信號(hào)的處理,它們有各自相對(duì)應(yīng)的常見(jiàn)函數(shù)。 ● 發(fā)送信號(hào)的函數(shù):kill()、raise()。 ● 捕捉信號(hào)的函數(shù):alarm()、pause()。 ● 處理信號(hào)的函數(shù):signal()、sigaction()。 本文選自華清遠(yuǎn)見(jiàn)嵌入式培訓(xùn)教材《從實(shí)踐中學(xué)嵌入式Linux應(yīng)用程序開(kāi)發(fā)》 熱點(diǎn)鏈接:
1、有名管道(FIFO) |