![文件在unix下是如何打开的?](https://linux22.com/image/37689/%E6%96%87%E4%BB%B6%E5%9C%A8unix%E4%B8%8B%E6%98%AF%E5%A6%82%E4%BD%95%E6%89%93%E5%BC%80%E7%9A%84%EF%BC%9F.png)
打开文件的内部流程是怎样的?
打开一个文件时,系统会将路径名转换为inode,然后从inode中搜索相应的驱动磁盘部分来查找文件的内容?是这样吗?我对打开文件的过程只有一个模糊的感觉,但我想要更多细节。
答案1
一般来说,你应该读一本书,比如这个获取内核中大多数此类细节的答案。但是,总的来说,是的,过程是这样的:
- 使用指定的路径遍历文件系统,从进程的根目录(由于
chroot
、和类似的原因,它可能与已知的系统 FS 根目录不同)jail
(LXC
如果是绝对路径),或者从当前进程目录,或者从指定的目录(在像 ) 这样的调用中openat
,两者都在相对路径的情况下。指定的路径被分割成一系列路径组件(用“/”分隔),并按顺序进行处理。在此过程中会分析目录内容和挂载点交叉(称为“路径查找”、“namei 查找”),并且每个路径组件都会导致对vnode
(sfile
在旧 Unix 中,inode
在 Linux 中)对象的临时引用。结果,如果成功,就会找到最终文件的 vnode(如果需要,则创建)并保留(通常使用引用计数来使其在内核 RAM 中保持活动状态)。 - 创建一个“打开文件”对象,引用此 vnode,并将其附加到
file descriptor
为此请求分配的进程' 。
对此目录搜索的细节对于特定的 VFS 来说非常具体。它可以是任何类型,包括仅基于内存的目录(tmpfs
)、基于磁盘的目录(ext4
等),但目录层次结构的通用概念仍然有效。