Linux操作系統(tǒng)的進程間通信的方法詳解
Linux操作系統(tǒng)中進程之間是怎么完成通信的呢?下面由學習啦小編為大家整理了Linux操作系統(tǒng)的進程間通信的方法詳解的相關(guān)知識,希望對大家有幫助!
Linux操作系統(tǒng)的進程間通信的方法詳解
Linux操作系統(tǒng)的進程間通信的方法一、管道(pipe)
管道是Linux支持的最初IPC方式,管道可分為無名管道,有名管道等。
(一)無名管道,它具有幾個特點:
1) 管道是半雙工的,只能支持數(shù)據(jù)的單向流動;兩進程間需要通信時需要建立起兩個管道;
2) 無名管道使用pipe()函數(shù)創(chuàng)建,只能用于父子進程或者兄弟進程之間;
3) 管道對于通信的兩端進程而言,實質(zhì)上是一種獨立的文件,只存在于內(nèi)存中;
4) 數(shù)據(jù)的讀寫操作:一個進程向管道中寫數(shù)據(jù),所寫的數(shù)據(jù)添加在管道緩沖區(qū)的尾部;另一個進程在管道中緩沖區(qū)的頭部讀數(shù)據(jù)。
(二)有名管道
有名管道也是半雙工的,不過它允許沒有親緣關(guān)系的進程間進行通信。具體點說就是,有名管道提供了一個路徑名與之進行關(guān)聯(lián),以FIFO(先進先出)的形式存在于文件系統(tǒng)中。這樣即使是不相干的進程也可以通過FIFO相互通信,只要他們能訪問已經(jīng)提供的路徑。
值得注意的是,只有在管道有讀端時,往管道中寫數(shù)據(jù)才有意義。否則,向管道寫數(shù)據(jù)的進程會接收到內(nèi)核發(fā)出來的SIGPIPE信號;應用程序可以自定義該信號處理函數(shù),或者直接忽略該信號。
Linux操作系統(tǒng)的進程間通信的方法二、信號量(semophore)
信號量是一種計數(shù)器,可以控制進程間多個線程或者多個進程對資源的同步訪問,它常實現(xiàn)為一種鎖機制。實質(zhì)上,信號量是一個被保護的變量,并且只能通過初始化和兩個標準的原子操作(P/V)來訪問。(P,V操作也常稱為wait(s),signal(s))
Linux操作系統(tǒng)的進程間通信的方法三、信號(Signal)
信號是Unix系統(tǒng)中使用的最古老的進程間通信的方法之一。操作系統(tǒng)通過信號來通知某一進程發(fā)生了某一種預定好的事件;接收到信號的進程可以選擇不同的方式處理該信號,一是可以采用默認處理機制—進程中斷或退出,一是忽略該信號,還有就是自定義該信號的處理函數(shù),執(zhí)行相應的動作。
內(nèi)核為進程生產(chǎn)信號,來響應不同的事件,這些事件就是信號源。信號源可以是:異常,其他進程,終端的中斷(Ctrl-C,Ctrl+\等),作業(yè)的控制(前臺,后臺進程的管理等),分配額問題(cpu超時或文件過大等),內(nèi)核通知(例如I/O就緒等),報警(計時器)。
Linux操作系統(tǒng)的進程間通信的方法四、消息隊列(Message Queue)
消息隊列就是消息的一個鏈表,它允許一個或者多個進程向它寫消息,一個或多個進程向它讀消息。Linux維護了一個消息隊列向量表:msgque,來表示系統(tǒng)中所有的消息隊列。
消息隊列克服了信號傳遞信息少,管道只能支持無格式字節(jié)流和緩沖區(qū)受限的缺點。
Linux操作系統(tǒng)的進程間通信的方法五、共享內(nèi)存(shared memory)
共享內(nèi)存映射為一段可以被其他進程訪問的內(nèi)存。該共享內(nèi)存由一個進程所創(chuàng)建,然后其他進程可以掛載到該共享內(nèi)存中。共享內(nèi)存是最快的IPC機制,但由于linux本身不能實現(xiàn)對其同步控制,需要用戶程序進行并發(fā)訪問控制,因此它一般結(jié)合了其他通信機制實現(xiàn)了進程間的通信,例如信號量。
Linux操作系統(tǒng)的進程間通信的方法六、套接字(socket)
socket也是一種進程間的通信機制,不過它與其他通信方式主要的區(qū)別是:它可以實現(xiàn)不同主機間的進程通信。一個套接口可以看做是進程間通信的端點(endpoint),每個套接口的名字是唯一的;其他進程可以訪問,連接和進行數(shù)據(jù)通信。