Linux中實現內部程序通訊

2021-04-12 21:07:01 字數 1365 閱讀 1306

linux給我們提供了豐富的內部程序通訊機制,包括共享記憶體、記憶體對映檔案、先入先出(fifo)、介面(sockets)以及多種用於同步的標識。在本文中,我們主要討論一下共享記憶體和記憶體對映檔案技術。 

一般來說,內部程序通訊(interprocess communication)也就是ipc,是指兩個或兩個以上程序以及兩個或者兩個以上執行緒之間進行通訊聯絡。每個ipc機制都有不同的強項或者弱點,不過沒有乙個ipc機制包含內建的同步方法。因此程式設計師不但需要自己在程式中實現同步,而且還需要為了利用ipc機制而自己開發通訊協議。

共享記憶體

使用共享記憶體和使用malloc來分配記憶體區域很相似。使用共享記憶體的方法是:

1.        對乙個程序/執行緒使用shmget分配記憶體區域。

2.        使用shmat放置乙個或多個程序/執行緒在共享記憶體中,你也可以用shmctl來獲取資訊或者控制共享區域。

3.        使用shmdt從共享區域中分離。

4.        使用shmctl解除分配空間

下面是個例子:

//建立共享記憶體區域

intshared_id;

char *region;

const intshm_size = 1024;

shared_id = shmget(ipc_private,//保證使用唯一id

shm_size,

ipc_creat | ipc_excl |//建立乙個新的記憶體區域 

s_irusr | s_iwusr);//使當前使用者可以讀寫這個區域

//交叉程序或生成程序.

//將新建的記憶體區域放入程序/執行緒

region = (char*) shmat(segment_id, 0, 0);

//其他程式**

...//將各個程序/執行緒分離出來

shmdt(region);

//破壞掉共享記憶體區域

shmctl(shared_id, ipc_rmid, 0);

共享記憶體是linux中最快速的ipc方法。他也是乙個雙向過程,共享區域內的任何程序都可以讀寫記憶體。這個機制的不利方面是其同步和協議都不受程式設計師控制,你必須確保將控制代碼傳遞給了子程序和執行緒。

記憶體對映檔案

記憶體對映檔案不僅僅用於ipc,在其他程序中它也有很大作用。如果你需要將乙個分配的緩衝區初始化為零,只要記住/dev/zero 。你也可以通過將檔案對映到記憶體中以提高其效能。它使你可以像讀寫字串一樣讀寫檔案。下面是個例子:

close(fd);

//使用對映區域.

...munmap(file_memory, flength);

使用記憶體對映的缺點是速度不如共享記憶體快。如果湊巧檔案很大,所需要的虛擬記憶體就會很大,這樣會造成整體效能下降。

Linux 管道 實現程序間通訊

管道是一種最基本的 ipc 機制,由 pipe 函式建立 include int pipe int filedes 2 呼叫 pipe 函式時在核心中開闢一塊緩衝區 稱為管道 用於通訊,它有乙個讀端乙個寫端,然後通過 filedes 引數傳出給使用者程式兩個檔案描述符,filedes 0 指向管道的...

Linux程序共享通訊 mmap實現

使用mmap記憶體對映實現一端寫,另一端讀的程序間通訊 寫端 write.c write.c include include include include include include include 對映記憶體大小 define maplen 0x100 定義乙個學生資訊結構體 struct ...

linux中的共享記憶體實現程序間通訊

1 管道 1 匿名管道 無名管道 實現有關係的程序間的通訊 2 命名管道 有名管道 任意兩程序間通訊 詳情見 2 共享記憶體 在記憶體中開闢一段共享記憶體空間,共不同程序間訪問 1 建立共享記憶體 int shmget key t key size t size,int shm key t key ...