linux進程間通信的幾種方式

 一。管道(pipe)
  管道是Linux支持的最初IPC方式,管道可分爲無名管道,有名管道等。
  (一)無名管道,它具備幾個特色:
  1) 管道是半雙工的,只能支持數據的單向流動;兩進程間須要通訊時須要創建起兩個管道;
  2) 無名管道使用pipe()函數建立,只能用於父子進程或者兄弟進程之間;
  3) 管道對於通訊的兩端進程而言,實質上是一種獨立的文件,只存在於內存中;
  4) 數據的讀寫操做:一個進程向管道中寫數據,所寫的數據添加在管道緩衝區的尾部;另外一個進程在管道中緩衝區的頭部讀數據。
  (二)有名管道
  有名管道也是半雙工的,不過它容許沒有親緣關係的進程間進行通訊。具體點說就是,有名管道提供了一個路徑名與之進行關聯,以FIFO(先進先出)的形式存在於文件系統中。這樣即便是不相干的進程也能夠經過FIFO相互通訊,只要他們能訪問已經提供的路徑。
  值得注意的是,只有在管道有讀端時,往管道中寫數據纔有意義。不然,向管道寫數據的進程會接收到內核發出來的SIGPIPE信號;應用程序能夠自定義該信號處理函數,或者直接忽略該信號。
  二。信號量(semophore)
  信號量是一種計數器,能夠控制進程間多個線程或者多個進程對資源的同步訪問,它常實現爲一種鎖機制。實質上,信號量是一個被保護的變量,而且只能經過初始化和兩個標準的原子操做(P/V)來訪問。(P,V操做也常稱爲wait(s),signal(s))
  三。信號(Signal)
  信號是Unix系統中使用的最古老的進程間通訊的方法之一。操做系統經過信號來通知某一進程發生了某一種預約好的事件;接收到信號的進程能夠選擇不一樣的方式處理該信號,一是能夠採用默認處理機制—進程中斷或退出,一是忽略該信號,還有就是自定義該信號的處理函數,執行相應的動做。
  內核爲進程生產信號,來響應不一樣的事件,這些事件就是信號源。信號源能夠是:異常,其餘進程,終端的中斷(Ctrl-C,Ctrl+\等),做業的控制(前臺,後臺進程的管理等),分配額問題(cpu超時或文件過大等),內核通知(例如I/O就緒等),報警(計時器)。
  四。消息隊列(Message Queue)
  消息隊列就是消息的一個鏈表,它容許一個或者多個進程向它寫消息,一個或多個進程向它讀消息。Linux維護了一個消息隊列向量表:msgque,來表示系統中全部的消息隊列。
  消息隊列克服了信號傳遞信息少,管道只能支持無格式字節流和緩衝區受限的缺點。
  五。共享內存(shared memory)
  共享內存映射爲一段能夠被其餘進程訪問的內存。該共享內存由一個進程所建立,而後其餘進程能夠掛載到該共享內存中。共享內存是最快的IPC機制,但因爲linux自己不能實現對其同步控制,須要用戶程序進行併發訪問控制,所以它通常結合了其餘通訊機制實現了進程間的通訊,例如信號量。
  socket也是一種進程間的通訊機制,不過它與其餘通訊方式主要的區別是:它能夠實現不一樣主機間的進程通訊。
相關文章
相關標籤/搜索