什么是共享内存
1.POSIX 共享内存
查看:
man shm_overview
ls /dev/shm
1.1分类
1.内存映射文件:
注意:共享内存大小 = 文件大小
2.匿名内存映射(亲缘进程)
风格 | 方式 |
---|---|
BSD | MAP_ANON+mmap() |
Systerm V | /dev/zero+open() |
3.共享内存区对象(非亲缘进程)
1.2 接口
头文件:sys/mman.h
库:rt
1.3 函数
POSIX 共享内存有5个函数
操作 | 函数 |
---|---|
创建 | int shm_open(const char *name, int oflag, mode_t mode) |
删除 | int shm_unlink(const char *name) |
建立内存映射 | void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset) |
关闭内存映射 | int munmap(void *start,size_t length) |
此外,在使用内存映射文件,经常要用到以下两个文件操作函数:
操作 | 函数 |
---|---|
获取文件信息 | int fstat(int fd,struct stat *buf) |
修改文件大小 | int ftruncate(int fd, off_t length) |
说明:
获取文件信息函数:fstat
int fstat(int fd,struct stat *buf);
参数说明:
参数 | 含义 |
---|---|
fd | 文件描述描述符 |
buf | struct stat |
struct stat说明:
参数 | 含义 |
---|---|
st_mode | 权限 |
st_size | 大小 |
st_uid | 属主ID |
st_guid | 组ID |
返回值说明:
返回值 | 含义 |
---|---|
-1 | 出错 |
0 | 成功 |
示例:
编写一个命令行程序,获取文件的大小
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(int argc,char* argv[]){
int fd = open(argv[1],O_RDONLY,0644); //编译后 ./a.out 后面跟打开文件名
struct stat file_stat; //stat是系统定义的一个结构体,里面定义了文件的属性
fstat(fd,&file_stat);
//stat(argv[1],&file_stat); //stat的第一个参数为文件名,而不是文件描述符,效果相同
printf("file :%s size: %d",argv[1],file_stat.st_size);
return 0;
}
修改文件大小函数:ftruncate
int ftruncate(int fd, off_t length)
参数说明:
参数 | 含义 |
---|---|
fd | 文件描述符 |
length | 文件大小,如果原来的文件大小比参数length大,超过的部分删除 |