Linux下:
1.管道: 管道通信的方式就是共享文件通信的方式,在連接的兩個進程之間建立一個共享文件,也稱pipe文件,可以傳輸大量數據。它與一般相比有些特殊:
1.專門用於通信 2.只能單向傳送 3.在讀寫操作中,進程之間需要的同步和互斥是由系統自動執行的。
分爲無名管道: 臨時無名文件。在物理上由文件系統的高速緩衝區構成,很少啓動外部設備 。因爲是臨時的,所以文件被關係後,文件就不存在了。用戶看不到存在,不需要系統調用open打開,建立就可以直接使用。只能在祖先進程,子孫進程,這種有家族關係的管道才能存在。
有名管道:在磁盤上會有對應的目錄,是真實文件。可實現無家族關係進程的通信。但雙方依然是單向的。
2.共享內存的方式
在內存中劃出一塊內存區作爲共享數據區,稱之爲共享內存區。要通信的雙方將自己的虛擬地址空間映射到內存分區上。
共享內存是最快的一種 IPC,因爲進程是直接對內存進行存取。因爲多個進程可以同時操作,所以需要進行同步。
3.消息隊列
消息隊列,是消息的鏈接表,存放在內核中。一個消息隊列由一個標識符(即隊列ID)來標識。
1、特點
消息隊列是面向記錄的,其中的消息具有特定的格式以及特定的優先級。
消息隊列獨立於發送與接收進程。進程終止時,消息隊列及其內容並不會被刪除。
消息隊列可以實現消息的隨機查詢,消息不一定要以先進先出的次序讀取,也可以按消息的類型讀取。
函數msgrcv
在讀取消息隊列時,type參數有下面幾種情況:
type == 0
,返回隊列中的第一個消息;type > 0
,返回隊列中消息類型爲 type 的第一個消息;type < 0
,返回隊列中消息類型值小於或等於 type 絕對值的消息,如果有多個,則取類型值最小的消息。
可以看出,type值非 0 時用於以非先進先出次序讀消息。也可以把 type 看做優先級的權值。(其他的參數解釋,請自行Google之)
參考鏈接:https://www.cnblogs.com/zgq0/p/8780893.html
4.信號量
信號量(semaphore)是一個計數器。信號量用於實現進程間的互斥與同步,而不是用於存儲進程間通信數據。
1、特點
-
信號量用於進程間同步,若要在進程間傳遞數據需要結合共享內存。
-
信號量基於操作系統的 PV 操作,程序對信號量的操作都是原子操作。
-
每次對信號量的 PV 操作不僅限於對信號量值加 1 或減 1,而且可以加減任意正整數。
-
支持信號量組。
2、原型
最簡單的信號量是隻能取 0 和 1 的變量,這也是信號量最常見的一種形式,叫做二值信號量(Binary Semaphore)。而可以取多個正整數的信號量被稱爲通用信號量。
Linux 下的信號量函數都是在通用的信號量數組上進行操作,而不是在一個單一的二值信號量上進行操作。
5.套接字( socket ) :
- 套解口也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同機器間的進程通信。
參考: