【发布时间】:2019-04-14 22:47:24
【问题描述】:
我对进程和打开文件表有点困惑。
我知道如果 2 个进程尝试打开同一个文件,打开文件表中将有 2 个条目。我试图找出原因。
为什么当 2 个不同的进程试图访问同一个文件时,在打开的文件表中会创建 2 个条目?为什么 1 个条目不能完成?
【问题讨论】:
标签: unix process filesystems kernel
我对进程和打开文件表有点困惑。
我知道如果 2 个进程尝试打开同一个文件,打开文件表中将有 2 个条目。我试图找出原因。
为什么当 2 个不同的进程试图访问同一个文件时,在打开的文件表中会创建 2 个条目?为什么 1 个条目不能完成?
【问题讨论】:
标签: unix process filesystems kernel
我不太清楚您所说的“文件表”是什么意思。 Linux 内核中没有称为“文件表”的通用结构。
有/etc/fstab,代表“文件系统表”,列出系统启动时自动挂载的文件系统。
您在此问题中包含的“filetable”堆栈溢出标记适用于 SQL Server,而不是直接与 Linux 连接。
当您谈论打开的文件时,您所指的似乎是链接。见Hard and soft link mechanism。当一个文件在 Linux 中打开时,内核会维护一个基本上是该文件的另一个硬链接。这就是为什么您实际上可以删除打开的文件并且系统将继续正常运行的原因。只有当应用程序关闭文件时,磁盘上的空间才会真正被标记为空闲。
所以对于文件系统上的每个 inode(一个 inode 通常我们认为是一个文件),通常有多个链接 - 一个用于目录中的每个条目,一个用于应用程序每次打开文件时。
更新:以下是引发此问题的网页引述:
每个文件表条目都包含有关当前文件的信息。最重要的是文件的状态,比如文件的读写状态等状态信息。此外,文件表条目维护一个偏移量,该偏移量描述了已从文件读取(或写入)多少字节,指示从何处读取/写入。
所以,要直接回答“为什么当 2 个不同的进程试图访问同一个文件时,会在打开的文件表中创建 2 个条目?”,需要 2 个条目,因为它们可能包含不同的信息。一个进程可能以只读方式打开文件,而另一进程则以读写方式打开文件。而且每个进程的文件偏移量(文件中的位置)几乎肯定会有所不同。
【讨论】: