系统api-共享内存

内存映射文件

mmap,munmap,msync

void* mmap(void* addr, size_t len,
	// PROT_READ/PROT_WRITE/PROT_EXEC/PROT_NONE
	int prot,
	// MAP_PRIVATE/MAP_SHARED
	int flags, int fd, off_t offset);
int munmap(void* addr, size_t len);
int msync(void* addr, size_t len, 
	// MS_ASYNC/MS_SYNC[针对MAP_SHARED映射返回地址范围内容的修改会同步更新到磁盘,这里显式触发一个更新到磁盘请求]		
	// MS_INVALIDATE[一个磁盘文件被多个进程以MAP_SHARED映射,其中一个做了改动.其他各个进程如映射相应范围也能看到改动后内容]
	int flags);

(1). 访问边界
内存映射以页面为单位.对映射区域,设其对应k个映射页面.一般第k个页面会超过映射要求的可视范围.对页内超出范围部分,允许进行读,写操作.写操作,不会实际写入文件.读操作,可以正常读.对超出K页外的映射区域进行访问,会引发SIGSEGV信号.

共享内存区对象

概述

Posix.1提供了两种在无亲缘关系进程间共享内存区的方法
(1). 共享文件映射
(2). 共享内存映射
shm_open打开一个Posix.1 IPC名字,所返回的描述符由mmap函数映射到当前进程的地址空间
在这里插入图片描述

shm_open和shm_unlink

Posix共享内存区涉及以下两个步骤要求
(1). 指定一个名字参数调用shm_open
以创建一个新的共享内存区对象或打开一个已存在的共享内存区对象
(2). 调用mmap把这个共享内存区映射到调用进程的地址空间

#include <sys/mman.h>
// 返回描述符
int shm_open(...);
// 删除一个名字不会影响对于底层支撑对象的现有引用,直到对该对象引用全部关闭为止
// 删除名字后,后续的open会失败
int shm_unlink(const char*);

ftruncate和fstate函数

mmap时,普通文件或共享内存区对象大小都可用ftruncate修改

#include <unistd.h>
int ftruncate(int fd, off_t length);

(1). 对普通文件
如该文件大小大于length,额外的数据被丢弃掉
如该文件大小小于length,则该文件是否修改及其大小是否增长是未加说明的

一种保证正确方法,先lseek到偏移为length-1处,写入1字节的数据
(2). 对共享内存区对象
ftruncate把该对象的大小设置成length字节

当打开一个已存在的共享内存区对象时,可调用fstat获取有关该对象的信息

#include <sys/types.h>
#include <sys/stat.h>
int fstat(int fd, struct stat* buf);

fd指代一个共享内存区对象时,只有四个成员含有信息

struct stat
{
	...
	mode_t st_mode;
	uid_t st_uid;
	gid_t st_gid;
	off_t st_size;
	...
};
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

raindayinrain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值