進程間通訊的目的:
- 數據傳輸:一個進程須要將它的數據發送給另外一個進程,發送的數據量在一個字節到幾兆字節之間。D1
- 共享數據:多個進程想要操做共享數據,一個進程對共享數據的修改,別的進程應該馬上看到。D2
- 通知事件:一個進程須要向另外一個或一組進程發送消息,通知它(它們)發生了某種事件(如進程終止時要通知父進程)。D3
- 資源共享:多個進程之間共享一樣的資源。爲了做到這一點,須要內核提供鎖和同步機制。D4
- 進程控制:有些進程但願徹底控制另外一個進程的執行(如Debug進程),此時控制進程但願可以攔截另外一個進程的全部陷入和異常,並可以及時知道它的狀態改變。D5
進程經過與內核及其它進程之間的互相通訊來協調它們的行爲。Linux支持多種進程間通訊(IPC)機制,信號和管道是其中的兩種。除此以外,Linux還支持System V 的IPC機制(用首次出現的Unix版本命名)。linux
Linux進程間通訊的發展歷史概略:
Linux下的進程通訊手段基本上是從Unix平臺上的進程通訊手段繼承而來的。而對Unix發展作出重大貢獻的兩大主力AT&T的貝爾實驗室及BSD(加州大學伯克利分校的伯克利軟件發佈中心)在進程間通訊方面的側重點有所不一樣。前者對Unix早期的進程間通訊手段進行了系統的改進和擴充,造成了「system V IPC」,通訊進程侷限在單個計算機內;後者則跳過了該限制,造成了基於套接口(socket)的進程間通訊機制。Linux則把二者繼承了下來,如圖示:socket
早期UNIX進程間通訊:包括管道(Pipe)、命名管道(FIFO)、信號(signal)。函數
System V IPC:包括System V消息隊列(Message)、System V信號量(Semaphore)、System V共享內存(Shared Memory)。spa
POSIX IPC:包括POSIX消息隊列(Message)、POSIX信號量(Semaphore)、POSIX共享內存(Shared Memory)。線程
linux下進程間通訊的幾種主要手段簡介:
- 管道(Pipe)及有名管道(named pipe):管道可用於具備親緣關係進程間的通訊,有名管道克服了管道沒有名字的限制,所以,除具備管道所具備的功能外,它還容許無親緣關係進程間的通訊;
- 信號(Signal):信號是比較複雜的通訊方式,用於通知接受進程有某種事件發生,除了用於進程間通訊外,進程還能夠發送信號給進程自己;linux除了支持Unix早期信號語義函數sigal外,還支持語義符合Posix.1標準的信號函數sigaction(實際上,該函數是基於BSD的,BSD爲了實現可靠信號機制,又可以統一對外接口,用sigaction函數從新實現了signal函數);
- 報文(Message)隊列(消息隊列):消息隊列是消息的連接表,包括Posix消息隊列system V消息隊列。有足夠權限的進程能夠向隊列中添加消息,被賦予讀權限的進程則能夠讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節流以及緩衝區大小受限等缺點。
- 共享內存:使得多個進程能夠訪問同一塊內存空間,是最快的可用IPC形式。是針對其餘通訊機制運行效率較低而設計的。每每與其它通訊機制,如信號量結合使用,來達到進程間的同步及互斥。
- 信號量(semaphore):主要做爲進程間以及同一進程不一樣線程之間的同步手段。
- 套接口(Socket):更爲通常的進程間通訊機制,可用於不一樣機器之間的進程間通訊。起初是由Unix系統的BSD分支開發出來的,但如今通常能夠移植到其它類Unix系統上:Linux和System V的變種都支持套接字。