一、共享内存是最快的ipc形式,共享内存区映射到共享他的进程的地址空间,这些进程间的数据通信就不在涉及内核。
mmap函数吧一个文件或者一个posix共享区对象映射到调用进程的地址空间,这个函数有三个目的:
1、使用普通文件以提供内存映射
2、使用特殊文件已提供匿名内存映射
3、使用shm_open以提供无亲缘关系的进程间的posix共享内存区
#include<sys/mman.h>
void *mmap(void *addr, size_t len, int port, int flags, int fd, off_t offset);
addr:指定fd映射到的起始地址空间,通常为NULL,函数的返回值是共享内存的起始地址
len:映射到进程地址空间的字节数,从被映射的文件头开始起0ffset个字节数,offset通常为0
port:PORT_READ :数据可读
PORT_WRITE :数据可写
PORT_EXEC :数据可执行
PORT_NONE : 数据不可访问
flags: MAP_SHARED :变动是共享的
MAP_PRIVATE :变动是私有的
MAP_FIXED :准确的解释addr参数 //此参数不应被指定
munmap 为某个进程空间删除一个映射关系
#include<sys/mman.h>
int munmap(void *addr, size_t len);
addr :为mmap返回的地址 len:映射区的大小
msync:用来同步硬盘上的文件内容和内存映射中的内容
#include <sys/mman.h>
int msync(void *addr, size_t len, int flags);
addr:起始地址,len:大小
flags:MS_ASYNC:执行异步读写
MS_SYNC :执行同步读写
MS_INVALIDATE:使高速缓存的数据失败
二、无亲缘关系进程间共享内存的两种方法
1、内存映射文件(memory-mapped file):由open函数打开,由mmap函数把得到的描述符映射到当前进程地址空间的一个文件。内存映射文件也可以在无亲缘关系的进程间共享
2、共享内存区对象(shared-memory object):由shm_open 打开一个posix ipc名字,(也许是在文件系统中的一个路径名),返回的描述符由mmap函数映射到当前进程的地址空间
posix 共享内存涉及两个步骤
1、制定一个名字参数,低哦用shm_open,以创建一个新的共享内存区对象或者打开一个已经存在的共享内存区对象
2、调用mmap把这个内存区映射到调用进程的地址空间
传递给shm_open的名字参数随后由希望共享该内存去的任何其他进程使用
#include<sys/mman.h>
int shm_open(const char* name, int oflag, mode_t mode);
int shm_unlink(const *name);
其他操作函数
#include <unistd.h>
int truncate(int fd, off_t length);
#include<sys/types.h>
#include<sys/stat.h>
int fstat(int fd, struct stat *buf);