Posix提供了兩種在無親緣關係進程間共享內存區的方法:函數
(1)內存映射文件:先有open函數打開,而後調用mmap函數把獲得的描述符映射到當前進程地址空間中的一個文件(上一篇筆記所用到的就是)。ui
(2)共享內存區對象:先有shm_open打開一個Posix IPC名字(也能夠是文件系統中的一個路徑名),而後調用mmap將返回的描述符映射到當前進程的地址空間。對象
者兩種方法多須要調用mmap,差異在於做爲mmap的參數之一的描述符的獲取手段。進程
Posix共享內存區涉及如下兩個步驟要求:內存
(1)指定一個名字參數調用shm_open,以建立一個新的共享內存區對象或打開一個已經存在的共享內存區對象。權限
(2)調用mmap把這個共享內存區映射到調用進程的地址空間。map
注意:mmap用於把一個內存區對象映射到調用進程地址空間的是該對象的一個已經打開描述符。方法
一、shm_openim
#include margin
int shm_open(const char *name, int oflag, mode_t mode);
1)name 共享內存區的名字
2)oflag 標誌位
3)mode 權限位,它指定O_CREAT標誌的前提下使用。
二、shm_unlink
int shm_unlink(const char *name);
刪除一個共享對象的名字
三、ftruncate
int ftruncate(int fd, off_t length);
將參數fd指定的文件大小改成參數length指定的大小
普通文件或共享內存區對象的大小均可以經過調用ftruncate修改
四、fstat
int fstat(int fd, struct stat *buf);
查看狀態
當打開一個已存在的共享內存區對象時,咱們可調用fstat來獲取有關該對象的信息
對於普通文件stat結構能夠得到12個以上的成員信息,然而當fd指代一個共享內存區對象時,只有四個成員含有信息。
struct stat
{
mode_t st_mode;
uid_t st_uid;
gid_t st_gid;
off_t st_size;
};