1、管道和 FIFO
管道是 UNIX 系統上最古老的 IPC 方法,它在 1970 年 UNIX 的第三個版本上就出現了。把一個進程連接到另一個進程的數據流稱為管道,管道被抽象成一個文件。
管道包括三種:
普通管道 pipe:通常有兩種限制,一是單工,數據只能單向傳輸;二是只能在父子或者兄弟進程間使用;
流管道 s_pipe:去除了普通管道的第一種限制,為半雙工,可以雙向傳輸;只能在父子或兄弟進程間使用;
有名管道 name_pipe(FIFO):去除了普通管道的第二種限制,并且允許在不相關(不是父子或兄弟關系)的進程間進行通訊。
2、信號
信號用于通知接收信號的進程有某種事件發生,所以可用于進程間通信;除了用于進程間通信之外,進程還可以發送信號給進程本身。
3、消息隊列
消息隊列是消息的鏈表,存放在內核中并由消息隊列標識符標識,消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩沖區大小受限等缺陷。消息隊列包括 POSIX 消息隊列和 System V 消息隊列。
消息隊列是 UNIX 下不同進程之間實現共享資源的一種機制,UNIX 允許不同進程將格式化的數據流以消息隊列形式發送給任意進程,有足夠權限的進程可以向隊列中添加消息,被賦予讀權限的進程則可以讀走隊列中的消息。
4、信號量
信號量是一個計數器,與其它進程間通信方式不大相同,它主要用于控制多個進程間或一個進程內的多個線程間對共享資源的訪問,相當于內存中的標志,進程可以根據它判定是否能夠訪問某些共享資源,同時,進程也可以修改該標志,除了用于共享資源的訪問控制外,還可用于進程同步。
它常作為一種鎖機制,防止某進程在訪問資源時其它進程也訪問該資源,因此,主要作為進程間以及同一個進程內不同線程之間的同步手段。Linux 提供了一組精心設計的信號量接口來對信號量進行操作,它們聲明在頭文件 sys/sem.h 中。
5、共享內存
共享內存就是映射一段能被其它進程所訪問的內存,這段共享內存由一個進程創建,但其它的多個進程都可以訪問,使得多個進程可以訪問同一塊內存空間。
共享內存是最快的 IPC 方式,它是針對其它進程間通信方式運行效率低而專門設計的,它往往與其它通信機制,譬如結合信號量來使用,以實現進程間的同步和通信。
6、套接字(Socket)
Socket 是一種 IPC 方法,是基于網絡的 IPC 方法,允許位于同一主機(計算機)或使用網絡連接起來的不同主機上的應用程序之間交換數據,說白了就是網絡通信。
在一個典型的客戶端/服務器場景中,應用程序使用 socket 進行通信的方式如下:
各個應用程序創建一個 socket。socket 是一個允許通信的“設備”,兩個應用程序都需要用到它。
服務器將自己的 socket 綁定到一個眾所周知的地址上使得客戶端能夠定位到它的位置。
-
Linux
+關注
關注
87文章
11345瀏覽量
210409 -
進程間通信
+關注
關注
0文章
16瀏覽量
2456
發布評論請先 登錄
相關推薦
評論