|  | |||||||||||||||||||||||||||||||||
| Linux下的信號機制 | |||||||||||||||||||||||||||||||||
| 本文關鍵字: linux 管道通信,linux 進程通信方式,信號 信號(hao)是在軟件(jian)層次(ci)上(shang)(shang)對中(zhong)(zhong)斷(duan)機制的(de)(de)一(yi)(yi)(yi)種模擬(ni)。在原理(li)上(shang)(shang),一(yi)(yi)(yi)個(ge)進(jin)程(cheng)(cheng)(cheng)收(shou)到一(yi)(yi)(yi)個(ge)信號(hao)與(yu)處理(li)器收(shou)到一(yi)(yi)(yi)個(ge)中(zhong)(zhong)斷(duan)請(qing)求可(ke)以(yi)說是一(yi)(yi)(yi)樣的(de)(de)。信號(hao)是異步的(de)(de),一(yi)(yi)(yi)個(ge)進(jin)程(cheng)(cheng)(cheng)不必通過任何操作來(lai)等待(dai)信號(hao)的(de)(de)到達(da),事(shi)實(shi)上(shang)(shang),進(jin)程(cheng)(cheng)(cheng)也(ye)不知(zhi)(zhi)道(dao)信號(hao)到底什(shen)么時(shi)候到達(da)。信號(hao)可(ke)以(yi)直接進(jin)行(xing)用(yong)(yong)戶(hu)空間(jian)進(jin)程(cheng)(cheng)(cheng)和內核進(jin)程(cheng)(cheng)(cheng)之間(jian)的(de)(de)交(jiao)互,內核進(jin)程(cheng)(cheng)(cheng)也(ye)可(ke)以(yi)利用(yong)(yong)它(ta)來(lai)通知(zhi)(zhi)用(yong)(yong)戶(hu)空間(jian)進(jin)程(cheng)(cheng)(cheng)發生了哪些系統(tong)事(shi)件(jian)。它(ta)可(ke)以(yi)在任何時(shi)候發給(gei)某(mou)一(yi)(yi)(yi)進(jin)程(cheng)(cheng)(cheng),而無(wu)須知(zhi)(zhi)道(dao)該進(jin)程(cheng)(cheng)(cheng)的(de)(de)狀(zhuang)態。如果(guo)該進(jin)程(cheng)(cheng)(cheng)當前并未處于執行(xing)態,則該信號(hao)就(jiu)由內核保存起來(lai),直到該進(jin)程(cheng)(cheng)(cheng)恢復執行(xing)再傳(chuan)(chuan)遞給(gei)它(ta)為(wei)止;如果(guo)一(yi)(yi)(yi)個(ge)信號(hao)被(bei)進(jin)程(cheng)(cheng)(cheng)設置為(wei)阻塞,則該信號(hao)的(de)(de)傳(chuan)(chuan)遞被(bei)延遲,直到其阻塞被(bei)取消(xiao)時(shi)才被(bei)傳(chuan)(chuan)遞給(gei)進(jin)程(cheng)(cheng)(cheng)。   信(xin)(xin)號是進程間通(tong)(tong)信(xin)(xin)機制(zhi)中唯(wei)一的(de)異步通(tong)(tong)信(xin)(xin)機制(zhi),可(ke)以(yi)看做是異步通(tong)(tong)知,通(tong)(tong)知接收信(xin)(xin)號的(de)進程有哪些事情(qing)發(fa)生了(le)。信(xin)(xin)號機制(zhi)經過Posix實時擴展后,功能更加強大(da),除了(le)基本通(tong)(tong)知功能外,還可(ke)以(yi)傳遞附加信(xin)(xin)息。 信號事件的發生有兩個來源:硬件來源(如我們按下了鍵盤上的按鈕或者出現其他硬件故障);軟件來源,常用發送信號的系統函數有kill()、raise()、alarm()、setitimer()和sigqueue()等(deng),軟件來源還包(bao)括(kuo)一(yi)些非法運算(suan)等(deng)操(cao)作。 進程可以通(tong)過3種方式(shi)來響應(ying)一個信號。 1.忽略(lve)信號(hao) 忽略信號(hao)即對信號(hao)不(bu)做任何處理(li),其中,有兩(liang)個信號(hao)不(bu)能忽略:SIGKILL和SIGSTOP。 2.捕捉信號 定義信號處(chu)理(li)函數,當(dang)信號發(fa)生(sheng)時,執(zhi)行相應的處(chu)理(li)函數。 3.執行默認(ren)操(cao)作 Linux對每種信號(hao)都規定(ding)了默認操(cao)作(zuo),如表1所示。 表1 常見信號的含義及其默認操(cao)作(zuo) 
 一個完整的信號生命周期可以分為3個重要階段,這3個階段由4個重要事件來刻畫的:信號產生、信號在進程中注冊、信號在進程中注銷、執行信號處理函數。這里信號的產生、注冊、注銷等是指信號的內部實現機制,而不是信號的函數實現。因此,信號注冊與否與本節后面講到的發送信號函數(如kill()等)及信號安裝函數(如signal()等(deng))無關,只(zhi)與信號值有關。 相(xiang)鄰兩(liang)個(ge)事件(jian)的(de)時(shi)間間隔(ge)構(gou)成(cheng)信(xin)號生命周期的(de)一(yi)個(ge)階段。要注(zhu)意這里(li)的(de)信(xin)號處理有多種(zhong)方(fang)式,一(yi)般是由(you)內核完成(cheng)的(de),當(dang)然也可以由(you)用戶(hu)進程來(lai)完成(cheng),故在此沒有明確指出。 信號(hao)的處(chu)理(li)(li)包括信號(hao)的發送、捕(bu)獲及信號(hao)的處(chu)理(li)(li),它(ta)們有各自相對應的常見函數。 ● 處理信號的函數:signal()、sigaction()。 本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》 熱(re)點鏈接:  
         1、有名管道(FIFO) |