linux進程間通信的3種方式:1、管道通信,發送信息的進程稱為寫進程,接收信息的進程稱為讀進程。2、消息緩沖通信,以消息緩沖區為中間介質,通信雙方的發送和接收操作均以消息為單位。3、共享內存通信。
本教程操作環境:Ubuntu 16.04系統、Dell G3電腦。
linux 進程間通信的3種方式
由于不同的進程運行在各自不同的內存空間中.一方對于變量的修改另一方是無法感知的.因此.進程之間的信息傳遞不可能通過變量或其它數據結構直接進行,只能通進程間通信來完成。
根據進程通信時信息量大小的不同,可以將進程通信劃分為兩大類型:控制信息的通信和大批數據信息的通信.前者稱為低級通信,后者稱為高級通信。
低級通信主要用于進程之間的同步、互斥、終止、掛起等等控制信息的傳遞。
高級通信主要用于進程間數據塊的交換和共享 常見的高級通信有管道(PIPE)、消息隊列(MESSAGE)、共享內存(SHARED MEM0RY)等。
這里主要比較一下高級通信的這三種方式的特點。
管道通信(PIPE)
? ? ? 兩個進程利用管道進行通信時.發送信息的進程稱為寫進程.接收信息的進程稱為讀進程。管道通信方式的中間介質就是文件.通常稱這種文件為管道文件.它就像管道一樣將一個寫進程和一個讀進程連接在一起,實現兩個進程之間的通信。寫進程通過寫入端(發送端)往管道文件中寫入信息;讀進程通過讀出端(接收端)從管道文件中讀取信息。兩個進程協調不斷地進行寫和讀,便會構成雙方通過管道傳遞信息的流水線。
? ? ? 利用系統調用PIPE()可以創建一個無名管道文件,通常稱為無名管道或PIPE;利用系統調用MKNOD()可以創建一個有名管道文件.通常稱為有名管道或FIFO。無名管道是一種非永
久性的管道通信機構.當它訪問的進程全部終止時,它也將隨之被撤消。無名管道只能用在具有家族聯系的進程之間。有名管道可以長期存在于系統之中.而且提供給任意關系的進程使用,但是使用不當容易導致出錯.所以操作系統將命名管道的管理權交由系統來加以控制管道文件被創建后,可以通過系統調用WRITE()和READ()來實現對管道的讀寫操作;通信完后,可用CLOSE()將管道文件關閉。
消息緩沖通信(MESSAGE)
? ? ? 多個獨立的進程之間可以通過消息緩沖機制來相互通信.這種通信的實現是以消息緩沖區為中間介質.通信雙方的發送和接收操作均以消息為單位。在存儲器中,消息緩沖區被組織成隊列,通常稱之為消息隊列。消息隊列一旦創建后即可由多進程共享.發送消息的進程可以在任意時刻發送任意個消息到指定的消息隊列上,并檢查是否有接收進程在等待它所發送的消息。若有則喚醒它:而接收消息的進程可以在需要消息的時候到指定的消息隊列上獲取消息.如果消息還沒有到來.則轉入睡眠狀態等待。
共享內存通信(SHARED MEMORY)
? ? ? 針對消息緩沖需要占用CPU進行消息復制的缺點.OS提供了一種進程間直接進行數據交換的通信方式一共享內存 顧名思義.這種通信方式允許多個進程在外部通信協議或同步,互斥機制的支持下使用同一個內存段(作為中間介質)進行通信.它是一種最有效的數據通信方式,其特點是沒有中間環節.直接將共享的內存頁面通過附接.映射到相互通信的進程各自的虛擬地址空間中.從而使多個進程可以直接訪問同一個物理內存頁面.如同訪問自己的私有空間一樣(但實質上不是私有的而是共享的)。因此這種進程間通信方式是在同一個計算機系統中的諸進程間實現通信的最快捷的方法.而它的局限性也在于此.即共享內存的諸進程必須共處同一個計算機系統.有物理內存可以共享才行。
三種方式的特點(優缺點):
1.無名管道簡單方便.但局限于單向通信的工作方式.并且只能在創建它的進程及其子孫進程之間實現管道的共享:有名管道雖然可以提供給任意關系的進程使用.但是由于其長期存在于系統之中,使用不當容易出錯。
2.消息緩沖可以不再局限于父子進程.而允許任意進程通過共享消息隊列來實現進程間通信.并由系統調用函數來實現消息發送和接收之間的同步.從而使得用戶在使用消息緩沖進行通信時不再需要考慮同步問題.使用方便,但是信息的復制需要額外消耗CPU的時間.不適宜于信息量大或操作頻繁的場合。
3.共享內存針對消息緩沖的缺點改而利用內存緩沖區直接交換信息,無須復制,快捷、信息量大是其優點。但是共享內存的通信方式是通過將共享的內存緩沖區直接附加到進程的虛擬地址空間中來實現的.因此,這些進程之間的讀寫操作的同步問題操作系統無法實現。必須由各進程利用其他同步工具解決。另外,由于內存實體存在于計算機系統中.所以只能由處于同一個計算機系統中的諸進程共享。不方便網絡通信。
相關推薦:《Linux視頻教程》