Linux POSIX IPC 共享内存

Linux POSIX IPC 共享内存

模型

创建/获取共享内存fd :shm_open()

创建者调整文件大小 :ftruncate()

映射fd到内存 :mmap()

去映射fd :munmap()

删除共享内存 :shm_unlink()

头文件 #include <unistd.h> //for fstat() #include <sys/types.h> //for fstat() #include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> shm_open //创建/获取共享内存的文件描述符,成功返回文件描述符,失败返回-1 //Link with -lrt. int shm_open(const char *name, int oflag, mode_t mode);

oflag

Access Mode:

O_RDONLY以只读的方式打开共享内存对象

O_RDWR以读写的方式打开共享内存对象

Opening-time flags(Bitwise Or):

O_CREAT 表示创建共享内存对象,刚被创建的对象会被初始化为0byte可以使用ftuncate()调整大小

O_EXCL用来确保共享内存对象被成功创建,如果对象已经存在,那么返回错误

O_TRUNC表示如果共享内存对象已经存在那么把它清空

mode: eg,0664 etc

ftruncate() //调整fd指向文件的大小,成功返回0,失败返回-1设errno //VS truncate() int ftruncate(int fd, off_t length);

如果原文件大小>指定大小,原文件中多余的部分会被截除

int res=ftruncate(fd,3*sizeof(Emp));//要用sizeof,且是Emp(类型)不是emp(对象) if(-1==res) perror("ftruncate"),exit(-1); fstat() //获取文件状态,成功返回0,失败返回-1设errno //VS stat() int lstat(const char *pathname, struct stat *buf); int fstat(int fd, struct stat *buf);

buf:stat类型的指针

struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ mode_t st_mode; /* protection */ 八进制 usigned int o% nlink_t st_nlink; /* number of hard links */ uid_t st_uid; /* user ID of owner */ gid_t st_gid; /* group ID of owner */ dev_t st_rdev; /* device ID (if special file) */ off_t st_size; /* total size, in bytes */ ld% blksize_t st_blksize; /* blocksize for filesystem I/O */ blkcnt_t st_blocks; /* number of 512B blocks allocated */ struct timespec st_atim; /* time of last access */ struct timespec st_mtim; /* time of last modification */ ld%,秒 struct timespec st_ctim; /* time of last status change */ }; //eg: st_mode=100664 //100是文件类型 //664是权限, 通过100664和0777BitwiseAND得到 st_mtime=1462787968 //秒 mmap() //映射文件或设备到进程的虚拟内存空间,映射成功后对相应的文件或设备操作就相当于对内存的操作 //映射以页为基本单位,文件大小, mmap的参数 len 都不能决定进程能访问的大小, 而是容纳文件被映射部分的最小页面数决定传统文件访问 //要求对文件进行可读可写的的打开!!! //成功返回映射区的指针,失败返回-1设errno void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); //prot:protection, 权限

addr:映射的起始地址, 如果为NULL则由kernel自行选择->最合适的方法
length:映射的区域长度
prot:映射内存的保护权限

PROT_EXEC表示映射的内存页可执行

PROT_READ表示映射的内存可被读

PROT_WRITE表示映射的内存可被写

PROT_NONE表示映射的内存不可访问

flags

must include one of :

MAP_SHARED表示共享这块映射的内存,读写这块内存相当于直接读写文件,这些操作对其他进程可见,由于OS对文件的读写都有缓存机制,所以实际上不会立即将更改写入文件,除非带哦用msync()或mumap()

MAP_PRIVATE表示创建一个私有的copy-on-write的映射, 更新映射区对其他映射到这个文件的进程是不可见的

can be Bitwise ORed:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/f70e02fbe6d46da46affd53bd49484e1.html