该mmap
系统调用需要一个FD作为参数,但是当你关闭FD,该MMAP仍然在进程的内存地址空间活着。
因此,保持 mmap 不需要打开的 fd,那么为什么 Linux 只支持使用 fd 创建文件的 mmap,而不支持使用文件名路径?如果我们可以mmapat
像openat
and那样有一个系统调用,那不是很好execveat
吗?
如果mmap
创建对该文件的额外引用,为什么我们不能mmapat
在第一次原子地创建这样的引用而不获取进程的 fd 然后稍后释放它。
在 Linux 内核上没有这样的系统调用是否有任何历史或安全原因?
mmap(2) 基本上是对内核将直接写入的缓冲区的 read(2),而不是读取内核缓冲区然后复制到提供的缓冲区。
出于同样的原因,没有 mmapat(2) 没有 readat(2)。
不再需要文件描述符,因为
mmap() 函数添加了对与文件描述符 fildes 关联的文件的额外引用,该文件描述符上的后续 close() 不会删除该文件。当没有更多映射到文件时,将删除此引用。
这是根据OpenGroup 的网站。 他们是管理 POSIX 标准的人,如果我没记错的话,他们应该知道。