MST
星途 面试题库

面试题:C语言中mmap函数的基本参数及返回值

在C语言的Linux环境下,简述mmap函数的主要参数含义以及正常和异常情况下的返回值分别是什么?
28.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

参数含义

  1. void *addr
    • 期望映射到的内存起始地址,通常设为NULL,让系统自动选择合适的地址。若指定非NULL地址,系统会尽量使用该地址,但并不保证一定使用,且指定的地址需满足系统的页对齐要求。
  2. size_t length
    • 要映射的文件区域大小,以字节为单位。必须是大于0的正整数。
  3. int prot
    • 映射区域的保护权限,可由以下几个值通过按位或(|)组合而成:
      • PROT_READ:表示映射区域可读。
      • PROT_WRITE:表示映射区域可写。
      • PROT_EXEC:表示映射区域可执行。
      • PROT_NONE:表示映射区域不可访问。
  4. int flags
    • 影响映射的行为,常用值有:
      • MAP_SHARED:共享映射,对映射区域的修改会反映到文件中,且其他映射同一文件的进程也能看到这些修改。
      • MAP_PRIVATE:私有映射,对映射区域的修改不会反映到文件中,且是进程私有的,其他进程看不到这些修改。
      • MAP_ANONYMOUS(或MAP_ANON):创建匿名映射,不与任何文件关联,常用于进程间通信等场景,此时fd参数应设为-1
  5. int fd
    • 要映射的文件描述符,通过open函数打开文件获得。若使用MAP_ANONYMOUS标志,则此参数设为-1
  6. off_t offset
    • 从文件开始处偏移的字节数,用于指定映射文件的起始位置。必须是系统内存页大小的整数倍(通常是4096字节)。

返回值

  1. 正常情况
    • 成功时,返回映射区的起始地址,该地址可用于后续对映射区域的访问操作。
  2. 异常情况
    • 失败时,返回MAP_FAILED(即(void *)-1),并设置errno以指示错误原因,常见的错误原因包括:
      • EBADFfd不是有效的文件描述符。
      • EACCES:权限不足,例如试图以写权限映射只读文件。
      • EINVAL:参数无效,如length为0、offset不是页大小的整数倍等。
      • ENOMEM:系统内存不足,无法完成映射。