Linux下進程間通信的方式

Linux進程間通信的方式

IPC是進程間通信的簡稱,是運行在某操作系統之上的不同進程間各種消息傳遞的方式。進程間通信的方法主要有以下幾種:

  (1)管道(Pipe):管道可用於具有親緣關係進程間的通信,允許一個進程和另一個與它有共同祖先(父子進程關係)的進程之間進行通信。

  (2)命名管道(namedpipe):命名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係進程間的通信。命名管道在文件系統中有對應的文件名。命名管道通過命令mkfifo或系統調用mkfifo來創建。

 

補充:匿名管道和命名管道的區別

管道(PIPE)實際是用於進程間通信的一段共享內存,創建管道的進程稱爲管道服務器,連接到一個管道的進程爲管道客戶機.一個進程在向管道寫入數據後,另一進程就可以從管道的另一端將其讀出來.管道分爲兩種:匿名管道和命名管道.匿名管道是在父進程和子進程間單向傳輸數據的一種未命名管道,只能在本地計算機中使用,而不能用於網絡間的通信.

匿名管道不支持異步讀寫操作.
命名管道是在管道是在管道服務器和一臺或多臺管道客戶機之間進行單向或雙向通信的一種命名的管道.一個命名管道的所有實例共享同一個管道名,但是每一個實例均擁有獨立的緩存和句柄,並且爲客戶-服務通信提供一個分離的管道.

命名管道可以在同一臺計算機的不同進程之間或在跨越一個網絡的不同計算機的不同進程間進行有連接的可靠數據通信,如果連接中斷,連接雙方都能立即收到連接斷開的信息。

 

  (3)信號(Signal):信號是比較複雜的通信方式,用於通知接受進程有某種事件發生,除了用於進程間通信外,進程還可以發送信號給進程本身;linux除了支持Unix早期信號語義函數sigal外,還支持語義符合Posix.1標準的信號函數sigaction(實際上,該函數是基於BSD的,BSD爲了實現可靠信號機制,又能夠統一對外接口,用sigaction函數重新實現了signal函數)。

  (4) 消息(Message)隊列:消息隊列是消息的鏈接表,包括Posix消息隊列system V消息隊列。有足夠權限的進程可以向隊列中添加消息,被賦予讀權限的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節流以及緩衝區大小受限等缺點

  (5)共享內存:使得多個進程可以訪問同一塊內存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設計的。往往與其它通信機制,如信號量結合使用,來達到進程間的同步及互斥。

  (6)內存映射(mappedmemory):內存映射允許任何多個進程間通信,每一個使用該機制的進程通過把一個共享的文件映射到自己的進程地址空間來實現它。

  (7)信號量(semaphore):主要作爲進程間以及同一進程不同線程之間的同步手段。

  (8)套接字(Socket):更爲一般的進程間通信機制,可用於不同機器之間的進程間通信。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和System V的變種都支持套接字

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