Linux下基於POSIX標準的共享記憶體操作示例

2021-06-09 18:59:58 字數 2974 閱讀 5623

對於程序間通訊,之前一直是用管道進行實現。比如父子程序間使用pipe,無血緣關係的程序可以使用fifo。從來沒有想過使用共享記憶體,為什麼呢?大家還記得這本書吧《unix環境高階程式設計》,上面講解了關於共享記憶體的操作,說實話,太麻煩了,真的不好用(有好多繁雜的介面,比如shmget, shmat,shmdt,chmctl等)。現在好了,基於posix標準的共享記憶體操作變得及其簡單,總共就幾個介面可供呼叫,已經變得像操作普通檔案一樣簡單!

新的標準的介面如下:

posix 為建立、對映、同步和取消共享記憶體段提供五個入口點:

使用共享記憶體的過程是,用shm_open()建立記憶體段,用write()ftruncate()設定它的大小,用mmap()把它對映到程序記憶體,執行其他參與者需要的操作。當使用完時,原來的程序呼叫munmap()shm_unlink(),然後退出。

怎麼樣?簡單吧,就像檔案操作一樣,開啟,對映得到乙個指標,對指標操作,然後撤銷對映,關閉!

下面給出兩段示例**,以示用來進行無血緣關係的程序間通訊

[cpp]view plain

copy

#include 

6 #include 

7 #include 

8 #include 

9 #include 

10 #include "util.h"

11   

12 void

error_and_die(

const

char

*msg)   

16   

17 int

main()  

18   

27   

28     ret = ftruncate(fd, region_size);  

29     if

(ret)  

30       

33   

34     void

*ptr = mmap(0, region_size, prot_read | prot_write , map_shared, fd, 0);  

35     if

(ptr == map_failed)  

36       

39   

40     close(fd);  

41     //*(int *)ptr = 0x55aa;

42     memcpy(ptr, string, (strlen(string) + 1));  

43   

44     sleep(10);  

45   

46     ret = munmap(ptr, region_size);  

47     if

(ret)  

48         error_and_die("munmap"

);  

49   

50     ret = shm_unlink(share_memory);  

51     if

(ret)  

52         error_and_die("shm_unlink"

);  

53     return

0;  

54   

55   

56 }  

[cpp:nogutter]view plain

copy

1 #include 

2 #include 

3 #include 

4 #include 

5 #include 

6 #include 

7 #include 

8 #include 

9 #include 

10 #include "util.h"

11   

12 void

error_and_die(

const

char

*msg)   

16   

17 int

main()  

18   

26   

27     ret = ftruncate(fd, region_size);  

28     if

(ret)  

29       

32   

33     void

*ptr = mmap(0, region_size, prot_read | prot_write , map_shared, fd, 0);  

34     if

(ptr == map_failed)  

35       

38   

39     close(fd);  

40   

41   

42     printf("%s"

, (char

*)ptr);  

43     ret = munmap(ptr, region_size);  

44     if

(ret)  

45         error_and_die("munmap"

);  

46   

47     ret = shm_unlink(share_memory);  

48     if

(ret)  

49         error_and_die("shm_unlink"

);  

50   

51     return

0;  

52 }  

**很簡單,唯一注意的地方是,第二個檔案中shm_open的時候o_tunc引數要去掉,否則記憶體又被截斷為0,讀不到東西的。

POSIX標準小結

1.posix posix 表示可移植作業系統介面 portable operating system inte ce 縮寫為 posix posix標準定義了作業系統應該為應用程式提供的介面標準,是ieee為要在各種unix作業系統上執行的軟體而定義的一系列api標準的總稱,其正式稱呼為ieee ...

POSIX標準與目錄管理

在linux作業系統中,實現了兩類對檔案io的管理,一類是遵循posix標準,linux作業系統自身提供的io系統呼叫,如open close read等函式 另一類是由ansi標準提供的標準io庫函式,這些函式是對直接io系統呼叫的封裝,其在訪問檔案時根據需要設定了不同型別的緩衝區,從而減少了直接...

Posix標準IPC筆記 1

1 usr src include 下的 errno.h 標頭檔案下宣告了乙個全域性變數 errno 每乙個unix函式在發生錯誤時都會設定 errno 在多執行緒環境下,每乙個執行緒擁有自己的errno變數。2 為了便於移植,posix ipc名字必須以斜槓符開頭,並且不能再含有其他任何斜槓符。i...