linux系統(tǒng)內(nèi)核提供了進(jìn)程間通信的機(jī)制
- IPC(InterProcess Communication)
IPC的目的
- 數(shù)據(jù)傳輸
- 數(shù)據(jù)共享
- 通知事件
- 資源共享
- 進(jìn)程控制
IPC分類, 有多種,如下只是其中2~3種
- 信號(hào)
- 管道
- 傳統(tǒng)的Unix System V的IPC機(jī)制
信號(hào)
- 信號(hào)主要是用來通知進(jìn)程異步事件的發(fā)生.最初信號(hào)設(shè)計(jì)的目的就是為了處理錯(cuò)誤,他們也用來作為最基本的IPC機(jī)制. 在linux中可以識(shí)別64種不同的信號(hào).這些大部分都有預(yù)先定義好的意義, 但是至少有兩個(gè): SIGUSR1 和 SIGUSR2 可以由應(yīng)用程序來定義.
- 進(jìn)程可以顯式的用kill 或者 killpg系統(tǒng)函數(shù)來向另一個(gè)進(jìn)程或者進(jìn)程組發(fā)出信號(hào). 此外,內(nèi)核可以響應(yīng)不同的事件而產(chǎn)生內(nèi)部信號(hào). 每一個(gè)信號(hào)都有一個(gè)默認(rèn)的動(dòng)作, 典型的默認(rèn)動(dòng)作就是終止進(jìn)程.
- 進(jìn)程可以通過提供信號(hào)處理函數(shù)來取代對(duì)于任意信號(hào)的默認(rèn)反應(yīng),信號(hào)發(fā)生時(shí), 內(nèi)核中斷當(dāng)前進(jìn)程,進(jìn)程執(zhí)行處理函數(shù)來響應(yīng)信號(hào),信號(hào)處理完成后,進(jìn)程恢復(fù)正常的處理. 這就是事件通知進(jìn)程和進(jìn)程響應(yīng)異步事件的方式.
- 信號(hào)也可以用來同步,進(jìn)程可以調(diào)用sigpause以等待信號(hào)的到來.
- 信號(hào)的局限性在于信號(hào)的系統(tǒng)開銷太大,而且信號(hào)的數(shù)量非常有限,且信號(hào)能傳遞的信息量有限,用戶產(chǎn)生的信號(hào)不能發(fā)送附加信息以及各種參數(shù),信號(hào)對(duì)應(yīng)事件通知很有用,但是對(duì)于復(fù)雜的交互操作,信號(hào)不能勝任.
- 系統(tǒng)中預(yù)定義的信號(hào),可以使用 kill -l命令顯示系統(tǒng)中的信號(hào)
- 進(jìn)程可以忽略大部分信號(hào),但是有2個(gè)是不能忽略的,除了這兩個(gè)信號(hào),其他的信號(hào)都可以被阻塞不被處理
- SIGSTOP : 這個(gè)信號(hào)將中斷進(jìn)程的執(zhí)行.
- SIGKILL : 這個(gè)信號(hào)將強(qiáng)制進(jìn)程退出.
- 為了讓進(jìn)程處理信號(hào),Linux必須維護(hù)進(jìn)程如何處理信號(hào)的信息,這些信息保存在一個(gè)sigaction數(shù)據(jù)結(jié)構(gòu)中.通過改變sigaction結(jié)構(gòu)可以改變對(duì)進(jìn)程對(duì)信號(hào)的默認(rèn)處理方式.
- 實(shí)際上,只有內(nèi)核和超級(jí)用戶有發(fā)送信號(hào)到其他進(jìn)程的權(quán)限.普通進(jìn)程只能向那些有相同UID和GID的進(jìn)程發(fā)送信號(hào),或者向那些在一個(gè)進(jìn)程組中的進(jìn)程發(fā)送信號(hào).
- 信號(hào)在產(chǎn)生后并不是立即發(fā)送給進(jìn)程的,它必須等到進(jìn)程再次運(yùn)行時(shí)才能發(fā)送.每當(dāng)進(jìn)程從系統(tǒng)調(diào)用中返回時(shí),系統(tǒng)就檢查進(jìn)程的task_struct結(jié)構(gòu),如果有任何非阻塞的信號(hào),那就就發(fā)送這個(gè)信號(hào).進(jìn)程也可以等待特定的信號(hào),在信號(hào)出現(xiàn)之前,進(jìn)程處于掛起狀態(tài).
- 如果一個(gè)信號(hào)處理程序被設(shè)置為默認(rèn)的動(dòng)作, 那么內(nèi)核會(huì)處理這個(gè)信號(hào).
- 除了默認(rèn)的信號(hào)處理以外,進(jìn)程也可以指定一個(gè)自己的信號(hào)處理程序,這才是編程需要處理的問題.
- Linux使用了堆棧來管理要執(zhí)行的信號(hào)處理程序.這樣當(dāng)一個(gè)信號(hào)處理程序完成操作時(shí),下一個(gè)將被調(diào)用.