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