Linux程序間通訊(IPC)

2022-09-18 08:42:20 字數 2233 閱讀 1540

程序通訊有例如以下一些目的:

a、傳輸資料:乙個程序須要將它的資料傳送給還有乙個程序。傳送的資料量在乙個位元組到幾m位元組之間

b、共享資料:多個程序想要操作共享資料。乙個程序對共享資料的改動,別的程序應該立馬看到。

c、通知事件:乙個程序須要向還有乙個或一組程序傳送訊息。通知它(它們)發生了某種事件(如程序終止時要通知父程序)。

d、資源共享:多個程序之間共享相同的資源。為了作到這一點,須要核心提供鎖和同步機制。

e、程序控制:有些程序希望全然控制還有乙個程序的執行(如debug程序)。此時控制程序希望可以攔截還有乙個程序的全部陷入和異常。並可以及時知道它的狀態改變。

本地的程序間通訊(ipc)有非常多種方式。但能夠總結為以下4類:

a、訊息傳遞(管道、fifo、訊息佇列)

b、同步(相互排斥量、條件變數、讀寫鎖、檔案和寫記錄鎖、訊號量)

c、共享記憶體(匿名的和具名的)

d、遠端過程呼叫(solaris門和sun rpc)

對unix發展做出重大貢獻的兩大主力at&t的貝爾實驗室及bsd(加州大學伯克利分校的伯克利軟體公布中心)在程序間通訊方面的側重點有所不同。前者對unix早期的程序間通訊手段進行了系統的改進和擴充,形成了「system v ipc」。通訊程序侷限在單個計算機內。後者則跳過了該限制。形成了基於套介面(socket)的程序間通訊機制,通訊程序作用在同乙個網內的計算機內。

linux則把兩者繼承了下來。

system v ipc包含:system v訊息佇列、system v訊號量、system v共享記憶體區;

最初的unix ipc包含:管道、fifo、訊號。

posix ipc包含: posix訊息佇列、posix訊號量、posix共享記憶體區。

有兩點須要簡單說明一下:

1)因為unix版本號的多樣性,電子電氣project協會(ieee)開發了乙個獨立的unix標準,這個新的ansi unix標準被稱為計算機環境的可移植性作業系統介面(posix)。

現有大部分unix和流行版本號都是遵循posix標準的。而linux從一開始就遵循posix標準;

2)bsd並非沒有涉足單機內的程序間通訊(socket本身就能夠用於單機內的程序間通訊)。

三、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的變種都支援套接字。

注:

linux程序間通訊:管道、訊號、訊號量、訊息佇列、共享記憶體、套接字(socket)

linux執行緒間通訊:相互排斥量(mutex),訊號量。條件變數

windows程序間通訊:管道、訊息佇列、共享記憶體、訊號量 (semaphore) 、套接字(socket)

windows執行緒間通訊:相互排斥量(mutex),訊號量(semaphore)、臨界區(critical section)、事件(event)

Linux程序間通訊 IPC

linux下的程序通訊手段基本上是從unix平台上的程序通訊手段繼承而來的。而對unix發展做出重大貢獻的兩大主力at t的貝爾實驗室及bsd 加州大學伯克利分校的伯克利軟體發布中心 在程序間通訊方面的側重點有所不同。前者對unix早期的程序間通訊手段進行了系統的改進和擴充,形成了 system v...

Linux程序 程序間通訊IPC

一 linux程序 1 程序的記憶體映像 2 解釋 bss段 在採用段式記憶體管理的架構中,bss段 bss segment 通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。bss是英文block started by symbol的簡稱。bss段屬於靜態記憶體分配。資料段 在採用段式記...

Linux程序間通訊 IPC 間比較

linux程序間通訊 ipc 方法主要有以下幾種 管道 fifo 共享記憶體 訊息佇列 訊號 1.管道中還有命名管道和非命名管道 即匿名管道 之分,非命名管道 即匿名管道 只能用於父子程序通訊,命名管道可用於非父子程序,命名管道就是fifo,管道是先進先出的通訊方式 2.訊息佇列是用於兩個程序之間的...