20

我对 Unix 系统文件表感到困惑。

  • 当两个或多个进程打开一个文件进行读取时,系统文件表是为每个进程创建单独的条目还是单个条目?

  • 如果为打开同一个文件的多个进程创建一个条目,它们的文件偏移量是否也相同?

  • 如果process 1打开file1.txt读取和process 2打开同一个文件file1.txt进行写入,系统文件表会创建一个还是两个条目?

4

2 回答 2

46

共有三个“系统文件表”: 有一个文件描述符表,将文件描述符(小整数)映射到打开文件表中的条目。打开文件表中的每个条目都包含(除其他外)一个文件偏移量和一个指向内存中 inode 表的指针。这是一张图片:(来源:rich from www.cs.ucsb.edu 现在在 archive.org 上在此处输入图像描述

因此,打开的文件既不是只有一个文件表条目,也不是每个进程只有一个……每次open()调用都有一个,如果文件描述符是dup()ed 或fork()ed,它是共享的。

回答您的问题:

  1. 当两个或更多进程打开一个文件进行读取时,每次打开的打开文件表中都有一个条目。如果一个进程多次打开文件,甚至每次打开都有一个条目。

  2. 对于打开同一个文件的不同进程,不会在打开文件表中创建单个条目(但在内存 inode 表中只有一个条目)。

  3. 如果 file1.txt 被打开两次,在同一个或两个不同的进程中,有两个不同的打开文件表条目(但在内存 inode 表中只有一个条目)。

于 2013-01-07T04:51:48.900 回答
-1

同一个文件可以同时被多个进程打开,甚至可以被同一个进程打开(导致同一个文件有多个文件描述符),这取决于文件组织和文件系统。描述符上的操作,如移动文件指针或关闭它是独立的(它们不会影响同一文件的其他描述符)。文件的操作(如写入)可以通过对其他描述符的操作看到(后读可以读取写入的数据)。

这是来自 open(System call) wiki 页面

于 2014-05-15T16:38:20.857 回答