POSIX共享内存实例
POSIX 共享内存
主要调用以下api
shm_open
1 | int shm_open(const char *name,int oflag,mode_t mode) |
需要以下头文件
1 |
该函数会打开或创建一个共享内存对象,通常保存在/dev/shm/路径下,实质上就是一个文件,linux认为所有的对象都是文件,可以使用文件操作函数,
返回值为文件描述符fd,成功时为正数,失败时为负数
各参数含义:
- name:文件名,不能填写路径
- oflag:位掩码,表示文件操作属性
- O_RDONLY 只读
- O_RDWR 读写
- O_CREAT 若文件不存在,则创建
- O_EXCL 在指定O_CREAT的情况下若文件已存在,则返回错误
- mode: 表示文件的共享模式,应在指定O_CREAT的情况下使用,即创建文件后的用户权限
ftruncate
1 | int ftruncate(int fd, off_t length) |
位于头文件 unistd.h 中
ftruncate()会将参数 fd 指定的文件大小改为参数 length 指定的大小。如果原来的文件大小比参数length大,则超过的部分会被删去。
off_t 是 long 的宏
使用该函数时,打开的文件必须具有写入权限
该函数的功能是重置文件的大小,任何open函数打开的文件都可以用该函数,包括但不限于shm_open打开的文件
执行成功则返回0,失败返回-1,错误原因存于errno(errno.h中定义的一个int型变量)。
mmap
1 | void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset); |
位于头文件 sys/mman.h 中
该函数的功能是将文件映射到内存中,使得我们用操作内存指针的方式来操作文件数据。
文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。 即映射的内存空间最小单位为页
其中各参数:
start: 将文件映射到的内存地址,一般应该传递NULL来由Linux内核指定。
length: 映射区的长度。长度单位是以字节为单位,不足一内存页按一内存页处理
prot: 是一个位掩码,映射的内存区域的操作权限(保护属性),包括PROT_READ、PROT_WRITE、PROT_EXEC、PROT_NONE
flags:
位掩码,指定映射对象的类型,包括
- MAP_SHARED: 与其它所有映射这个对象的进程共享映射空间。对共享区的写入,相当于输出到文件。直到msync()或者munmap()被调用,文件实际上不会被更新。
- MAP_PRIVATE: 建立一个写入时拷贝的私有映射。内存区域的写入不会影响到原文件。这个标志和以上标志是互斥的,只能使用其中一个。
- MAP_ANON: 进行匿名映射,此时fd参数要填-1
- 等
fd: 用来建立映射区的文件描述符,用 shm_open打开或者open打开的文件。
offset: 映射文件相对于文件头的偏移位置,应该按4096字节对齐。
成功执行时,mmap()返回被映射区的指针;失败时,mmap()返回MAP_FAILED。
要对该映射的内存写入内容,可以使用sprintf()或write()函数,在此之前先将mmap的返回值类型由 void* 转换成 char*
munmap
1 | int munmap(void *start,size_t length) |
使用头文件 unistd.h 和 sys/mman.h
函数功能是取消参数start所指的映射内存起始地址,参数length则是欲取消的内存大小。
当进程结束或利用exec相关函数来执行其他程序时,映射内存会自动解除,但关闭对应的文件描述符时不会解除映射。
返回值: 如果解除映射成功则返回0,否则返回-1,错误原因存于errno中
shn_unlink
1 | int shm_unlink(const char *name): |
使用头文件 sys/stat.h 和 fcntl.h
该函数用于删除指定的共享内存对象