文件打开和关闭过程

当用户进程想打开文件,就像向操作系统申请通行证,通过 open() 系统调用,提供文件名和打开模式。

内核拿到请求,首先得验证权限,就像门卫一样,检查进程是否有权访问,比如用户ID和组ID是否匹配,权限位是否允许等。 没权限就返回错误,直接拒绝。

权限过了,内核就要在文件系统里找对应的 inode,就像在档案室里找文件。 如果文件不存在,但打开模式允许创建,就创建一个新的 inode。

找到 inode 后,内核会在进程的文件描述符表中找个空位,文件描述符就像是借阅卡,每个进程都有自己的卡。

然后,内核会创建一个文件对象,也叫文件句柄,维护文件的状态信息,比如读写位置。文件对象是系统级的,可以被多个进程共享。

最后,内核建立连接,将文件描述符指向文件对象,文件对象指向 inode。这样,进程就可以通过文件描述符访问文件了。 open() 成功后,返回文件描述符给用户进程,进程就能用它读写文件了。

关闭文件也很有意思。进程调用 close(),内核首先验证文件描述符是否有效。

有效的话,内核把它从进程的文件描述符表中移除,这样这个描述符就能被下次打开文件重用了。同时,内核减少文件对象的引用计数。因为文件对象可能被多个进程共享,只有当引用计数为零时,才会真正释放。

释放文件对象时,内核会把文件缓冲区的数据写回磁盘,保证数据不丢失,然后释放文件对象占用的内存。 如果这是最后一个指向 inode 的链接,且文件被删除了,内核还会释放 inode 和文件数据块占用的空间。

总的来说,文件的打开和关闭过程保证了文件访问的安全性、效率以及资源的合理利用。