天天看点

21、Posix共享内存

1、posix共享内存区涉及两个步骤:

1)指定一个名字参数调用shm_open,以创建一个新的共享内存区对象或打开一个以存在的共享内存区对象。

2)调用mmap把这个共享内存区映射到调用进程的地址空间。传递给shm_open的名字参数随后由希望共享该内存区的任何其他进程使用。

2、函数

(1)创建

#include <sys/mman.h>

int shm_open(const char *name,int oflag,mode_t mode);

1)name    共享内存区的名字

2)oflag    标志位

3)mode    权限位,它指定O_CREAT标志的前提下使用。

(2)删除

int shm_unlink(const char *name);

(3)调整大小

    普通文件或共享内存区对象的大小都可以通过调用ftruncate修改。

int ftruncate(int fd,off_t length);

(4)查看状态

当打开一个已存在的共享内存区对象时,我们可调用fstat来获取有关该对象的信息。

#include <unistd.h>

#include <sys/types.h>

#include <sys/stat.h>

int stat(const char *file_name,struct stat *buf);

对于普通文件stat结构可以获得12个以上的成员信息,然而当fd指代一个共享内存区对象时,只有四个成员含有信息。

struct stat

{

mode_t st_mode;

uid_t st_uid;

gid_t st_gid;

off_t st_size;

};

g++ -g -o statt fstatt.cpp  -lrt

3、示例

示例1

21、Posix共享内存
21、Posix共享内存

View Code

示例2

21、Posix共享内存
21、Posix共享内存

pshm_w

21、Posix共享内存
21、Posix共享内存

pshm_r

g++ -o pw pshm_w.cpp -lrt

参考

【2】 非常不错的中文man

<a href="http://cpp.ezbty.org/import_doc/linux_manpage/shm_unlink.3.html">http://cpp.ezbty.org/import_doc/linux_manpage/shm_unlink.3.html</a>

<a href="http://cpp.ezbty.org/manpage">http://cpp.ezbty.org/manpage</a>

继续阅读