面试题答案
一键面试参数含义
void *addr
:- 期望映射到的内存起始地址,通常设为
NULL
,让系统自动选择合适的地址。若指定非NULL
地址,系统会尽量使用该地址,但并不保证一定使用,且指定的地址需满足系统的页对齐要求。
- 期望映射到的内存起始地址,通常设为
size_t length
:- 要映射的文件区域大小,以字节为单位。必须是大于0的正整数。
int prot
:- 映射区域的保护权限,可由以下几个值通过按位或(
|
)组合而成:PROT_READ
:表示映射区域可读。PROT_WRITE
:表示映射区域可写。PROT_EXEC
:表示映射区域可执行。PROT_NONE
:表示映射区域不可访问。
- 映射区域的保护权限,可由以下几个值通过按位或(
int flags
:- 影响映射的行为,常用值有:
MAP_SHARED
:共享映射,对映射区域的修改会反映到文件中,且其他映射同一文件的进程也能看到这些修改。MAP_PRIVATE
:私有映射,对映射区域的修改不会反映到文件中,且是进程私有的,其他进程看不到这些修改。MAP_ANONYMOUS
(或MAP_ANON
):创建匿名映射,不与任何文件关联,常用于进程间通信等场景,此时fd
参数应设为-1
。
- 影响映射的行为,常用值有:
int fd
:- 要映射的文件描述符,通过
open
函数打开文件获得。若使用MAP_ANONYMOUS
标志,则此参数设为-1
。
- 要映射的文件描述符,通过
off_t offset
:- 从文件开始处偏移的字节数,用于指定映射文件的起始位置。必须是系统内存页大小的整数倍(通常是4096字节)。
返回值
- 正常情况:
- 成功时,返回映射区的起始地址,该地址可用于后续对映射区域的访问操作。
- 异常情况:
- 失败时,返回
MAP_FAILED
(即(void *)-1
),并设置errno
以指示错误原因,常见的错误原因包括:EBADF
:fd
不是有效的文件描述符。EACCES
:权限不足,例如试图以写权限映射只读文件。EINVAL
:参数无效,如length
为0、offset
不是页大小的整数倍等。ENOMEM
:系统内存不足,无法完成映射。
- 失败时,返回