共享内存:文件映射到共享内存,用于传送数据
1. POSIX 共享内存
查看:
共享内存一般生成在 ls /dev/shm
ls /dev/ 看到绿色的文件都是用来通信的
接口:
头文件: sys/mman.h
库: librt.so
2. 函数
操作 | 函数 |
---|---|
创建 | 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) |
创建内存映射
创建 shm_open(文件名, 标志, 权限)
建立内存映射 mmap(通常为NULL, 映射区域长度, 内存保护标志, 映射对象类型, 文件描述符, 通常为0)
内存保护标志:
参数 | 含义 |
---|---|
PROT_EXEC | 页内容可以被执行 |
PROT_READ | 页内容可以被读取 |
PROT_WRITE | 页可以被写入 |
PROT_NONE | 页不可访问,不能与文件的打开模式冲突 |
映射对象类型:
参数 | 含义 |
---|---|
MAP_SHARED | 变动共享 |
MAP_PRIVATE | 变动私有 |
MAP_ANON | 匿名内存映射 |
返回值:
返回值 | 含义 |
---|---|
MAP_FAILED | 失败 |
其他 | 共享内存地址 |
关闭内存映射 int munmap(开始地址, 区域长度)
示例:
创建文件并映射到共享内存
#include <iostream>
#include <sys/shm.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
using namespace std;
int main(int argc,char* argv[]){
int fd = open(argv[1],O_RDWR); // 创建文件
if(-1 == fd){
perror("shm_open error");
return 1;
}
void* p = mmap(NULL,1024,PROT_READ,MAP_PRIVATE,fd,0); // 建立内存映射
if(MAP_FAILED == p){
perror("mmap error");
return 1;
}
cout << (char*)p << endl;
munmap(p,1024); // 关闭内存映射
p = NULL;
close(fd);
}
结果为:
[root@foundation1 C++7.11]# vim file_map.cpp
[root@foundation1 C++7.11]# g++ file_map.cpp -lrt
[root@foundation1 C++7.11]# ./a.out ./file_map.cpp
#include <iostream>
#include <sys/shm.h>
// 后面为文件内容,即程序,省略
直接可以把别的文件映射出来
3. 给文件追加信息
传统的方式:拷贝到原数据后面
#include <unistd.h>
#include <iostream>
#include <cstring>
#include <fcntl.h>
using namespace std;
int main(int argc,char* argv[]){
int fd = open(argv[1],O_RDWR);
if(-1 == fd){
perror("open error");
return 1;
}
char buffer[1024