進程間通信的幾種方式

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、特點

  1. 信號量用於進程間同步,若要在進程間傳遞數據需要結合共享內存。

  2. 信號量基於操作系統的 PV 操作,程序對信號量的操作都是原子操作。

  3. 每次對信號量的 PV 操作不僅限於對信號量值加 1 或減 1,而且可以加減任意正整數。

  4. 支持信號量組。

2、原型

最簡單的信號量是隻能取 0 和 1 的變量,這也是信號量最常見的一種形式,叫做二值信號量(Binary Semaphore)。而可以取多個正整數的信號量被稱爲通用信號量。

Linux 下的信號量函數都是在通用的信號量數組上進行操作,而不是在一個單一的二值信號量上進行操作。

5.套接字( socket ) :

  • 套解口也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同機器間的進程通信。

 

參考:

https://www.cnblogs.com/liugh-wait/p/8533003.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章