面试题答案
一键面试mmap函数基本参数及其作用
void *addr
- 作用:指定映射区的起始地址。通常设为
NULL
,表示由系统自动选择合适的地址进行映射。如果不为NULL
,则必须是页对齐的地址,且一般在实际应用中不建议自行指定非NULL
值,除非对内存布局有非常明确的需求。
- 作用:指定映射区的起始地址。通常设为
size_t length
- 作用:指定映射区的长度,以字节为单位。这个长度必须是系统内存页大小(通常为4096字节,可通过
getpagesize()
函数获取)的整数倍。
- 作用:指定映射区的长度,以字节为单位。这个长度必须是系统内存页大小(通常为4096字节,可通过
int prot
- 作用:指定映射区域的保护权限。
PROT_READ
:表示映射区域可读取。PROT_WRITE
:表示映射区域可写入。PROT_EXEC
:表示映射区域可执行。PROT_NONE
:表示映射区域不可访问。- 这些标志可以使用按位或(
|
)操作符进行组合,例如PROT_READ | PROT_WRITE
表示映射区域可读可写。
- 作用:指定映射区域的保护权限。
int flags
- 作用:指定映射的类型和其他标志。
MAP_SHARED
:表示对映射区域的写入会反映到文件中,并且其他映射同一个文件的进程也可以看到这些修改。MAP_PRIVATE
:表示对映射区域的写入会产生一个该区域的副本(写时复制,copy - on - write),不会影响到原文件,其他映射同一个文件的进程也看不到这些修改。- 还有其他一些标志,如
MAP_FIXED
(若指定了addr
,则严格按照指定地址进行映射,不推荐使用,因为可能导致不可预测的结果)等。
- 作用:指定映射的类型和其他标志。
int fd
- 作用:要映射的文件描述符。该文件必须已经以适当的模式(如
O_RDONLY
、O_RDWR
等)打开。通过文件描述符,mmap
函数可以将文件内容映射到内存中。
- 作用:要映射的文件描述符。该文件必须已经以适当的模式(如
off_t offset
- 作用:指定从文件的何处开始映射,以字节为单位。这个偏移量必须是系统内存页大小的整数倍。
通过权限参数设置保障内存映射区域安全性
- 合理设置
prot
参数:- 如果映射的区域只用于读取数据,应只设置
PROT_READ
权限,避免设置PROT_WRITE
权限,这样可以防止程序意外写入导致数据损坏。例如,如果是映射一个只读配置文件,设置prot = PROT_READ
。 - 对于不需要执行代码的映射区域,避免设置
PROT_EXEC
权限,以防止恶意代码注入执行。例如,映射的数据文件区域,一般不应设置PROT_EXEC
。
- 如果映射的区域只用于读取数据,应只设置
- 正确选择
flags
参数:- 如果不希望对映射区域的修改影响到原文件,并且要保证数据的隔离性,应选择
MAP_PRIVATE
。例如,在一些临时数据处理场景中,对映射区域的修改不应影响到源文件。 - 如果多个进程需要共享对映射区域的修改,且这种修改需要反映到文件中,则选择
MAP_SHARED
,但要注意多进程并发访问的同步问题,可通过信号量、互斥锁等机制来保障数据一致性。
- 如果不希望对映射区域的修改影响到原文件,并且要保证数据的隔离性,应选择