Linux 程序間通訊總結

2021-08-24 20:03:50 字數 2459 閱讀 5667

pipe管道

屬於匿名管道,這個通訊管道通過pipe(int filedes[2])系統呼叫而建立,filedes[0]代表讀端,filedes[1]代表寫端,

fifo

又叫做命名管道,由於fifo在檔案基礎上為管道提供了命名服務,fifo通過乙個真實的檔名來訪問

system v ipc

共享記憶體(shared memory)

訊息佇列(message queue)

訊號量(semaphore)

linux共享記憶體機制

mmap()

mmap系統呼叫並不是完全為了用於共享記憶體而設計的。它本身提供了不同於一般對普通檔案的訪問方式,程序可以像讀寫記憶體一樣對普通檔案的操作。而 posix或系統v的共享記憶體ipc則純粹用於共享目的,當然mmap()實現共享記憶體也是其主要應用之一。

mmap系統呼叫使得程序之間通過對映同乙個普通檔案實現共享記憶體。普通檔案被對映到程序位址空間後,程序可以像訪問普通記憶體一樣對檔案進行訪問,不必再呼叫read(),write()等操作。

我們的程式中大量運用了mmap,用到的正是mmap的這種「像訪問普通記憶體一樣對檔案進行訪問」的功能。實踐證明,當要對乙個檔案頻繁的進行訪問,並且指標來回移動時,呼叫mmap比用常規的方法快很多。

來看看mmap的定義:

void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);

引數fd為即將對映到程序空間的檔案描述字,一般由open()返回,同時,fd可以指定為-1,此時須指定flags引數中的map_anon,表明進 行的是匿名對映(不涉及具體的檔名,避免了檔案的建立及開啟,很顯然只能用於具有親緣關係的程序間通訊)。

len是對映到呼叫程序位址空間的位元組數,它從被對映檔案開頭offset個位元組開始算起。

prot引數指定共享記憶體的訪問許可權。可取如下幾個值的或:prot_read(可讀),prot_write(可寫),prot_exec(可執行),prot_none(不可訪問)。

flags由以下幾個常值指定:map_shared, map_private, map_fixed。其中,map_shared,map_private必選其一,而map_fixed則不推薦使用。

如果指定為map_shared,則對對映的記憶體所做的修改同樣影響到檔案。如果是map_private,則對對映的記憶體所做的修改僅對該程序可見,對檔案沒有影響。

offset引數一般設為0,表示從檔案頭開始對映。

引數addr指定檔案應被對映到程序空間的起始位址,一般被指定乙個空指標,此時選擇起始位址的任務留給核心來完成。函式的返回值為最後檔案對映到程序空間的位址,程序可直接操作起始位址為該值的有效位址。

這裡不再詳細介紹mmap的引數,讀者可參考mmap手冊頁或者《unix netword programming》卷二12.2節獲得進一步的資訊。

最後,舉個例子來結束本節。4.2節說過,fileinformation陣列是以二進位制的形式寫進乙個叫inforindex的檔案中。那麼,當要訪問fileinformation陣列時,**類似這樣:

struct stat st;

char buffer=」 inforindex」;

fileinformation *_fileinfoindexptr = null;

if(stat(buffer,&st)<0)

// mmap the inforindex to _fileinfoindexptr

int fd=open(buffer, o_rdonly);

if(fd<0)

_fileinfoindexptr = (fileinformation*)mmap(null,st.st_size, prot_read,map_shared,fd,0);

if(map_failed == _fileinfoindexptr)

close(fd);

system v shm 和 mmap的比較

1、 系統v共享記憶體中的資料,從來不寫入到實際磁碟檔案中去;而通過mmap()對映普通檔案實現的共享記憶體通訊可以指定何時將資料寫入磁碟檔案中。注:系統v共享記憶體機制實際是通過對映特殊檔案系統shm中的檔案實現的,檔案系統shm的安裝點在交換分割槽上,系統重新引導後,所有的內容都丟失。

2、 系統v共享記憶體是隨核心持續的,即使所有訪問共享記憶體的程序都已經正常終止,共享記憶體區仍然存在(除非顯式刪除共享記憶體),在核心重新引導之前,對該共享記憶體區域的任何改寫操作都將一直保留。

3、 通過呼叫mmap()對映普通檔案進行程序間通訊時,一定要注意考慮程序何時終止對通訊的影響。而通過系統v共享記憶體實現通訊的程序則不然。

mmap參考 :

system v shm :

steven yang 2009-10-10 defeattroy at gmail.com

Linux程序間通訊總結

目錄訊號 管道命名管道 system v ipc 組成 識別符號ftok函式 結構定義 特點 訊息佇列 訊號量共享記憶體 套接字linux下的程序間通訊 interprocess communication,ipc 方式基本上是從unix繼承而來的。對unix發展做出重大貢獻的兩個實驗室 at t的...

Linux程序間通訊方式總結

linux系統中的程序間通訊方式主要以下幾種 同一主機上的程序通訊方式 unix程序間通訊方式 包括管道 pipe 有名管道 fifo 和訊號 signal system v程序通訊方式 包括訊號量 semaphore 訊息佇列 message queue 和共享記憶體 shared memory ...

linux 程序間通訊方式總結

對linux 程序通訊的一點簡單總結,主要包括 管道通訊,還有 system v,posix 標準的 訊息佇列,訊號量,共享記憶體方式。基於管道的通訊主要包括有名管道,和無名管道,所謂的有名管道,就是建立的時候會帶有具體的標識,以便於確認對誰操作,而無名管道是建立沒有名字的管道,在於用的時候是否需要...