面试题答案
一键面试1. 通过mmap
函数控制映射范围的方法
mmap
函数通过length
参数来精确控制映射范围。该参数指定了从文件偏移量开始映射到内存中的字节数。
2. mmap
函数相关参数作用
void *addr
:- 作用:指定映射区的起始地址。通常设为
NULL
,表示由内核选择合适的地址进行映射。如果不为NULL
,则内核会尽量将映射区放在该地址处,但这并不保证一定成功,这取决于系统的内存布局和分配策略。 - 示例:
void *ptr = mmap(NULL, length, prot, flags, fd, offset);
,这里使用NULL
让内核自动选择映射起始地址。
- 作用:指定映射区的起始地址。通常设为
size_t length
:- 作用:指定映射区的长度(以字节为单位)。这个长度决定了从文件偏移量开始映射到内存中的数据量,从而精确控制映射范围。
- 示例:
mmap(addr, 4096, prot, flags, fd, offset);
,这里映射长度为4096字节。
int prot
:- 作用:指定映射区的保护权限。常用的标志有:
PROT_READ
:表示映射区可读。PROT_WRITE
:表示映射区可写。PROT_EXEC
:表示映射区可执行。- 可以通过按位或操作来组合多个权限,如
PROT_READ | PROT_WRITE
表示映射区可读可写。
- 示例:
mmap(addr, length, PROT_READ | PROT_WRITE, flags, fd, offset);
,设置映射区可读可写。
- 作用:指定映射区的保护权限。常用的标志有:
int flags
:- 作用:指定映射的类型和其他特性。常用标志有:
MAP_SHARED
:共享映射,对映射区的修改会反映到文件中,并且其他映射该文件的进程也能看到这些修改。MAP_PRIVATE
:私有映射,对映射区的修改不会反映到文件中,且对其他进程不可见,修改只在本进程内有效。MAP_ANONYMOUS
:匿名映射,不与任何文件关联,通常用于创建共享内存。此时fd
参数应设为-1
,offset
参数被忽略。
- 示例:
mmap(addr, length, prot, MAP_SHARED, fd, offset);
,创建共享映射。
- 作用:指定映射的类型和其他特性。常用标志有:
int fd
:- 作用:要映射的文件描述符。如果使用
MAP_ANONYMOUS
标志创建匿名映射,该参数应设为-1
。 - 示例:
int fd = open("test.txt", O_RDWR); mmap(addr, length, prot, flags, fd, offset);
,使用打开的文件test.txt
的文件描述符进行映射。
- 作用:要映射的文件描述符。如果使用
off_t offset
:- 作用:指定从文件的何处开始映射,必须是系统内存页大小的整数倍(通常为4096字节)。
- 示例:
mmap(addr, length, prot, flags, fd, 4096);
,从文件偏移量4096字节处开始映射。