Unix系统文件表

Unix系统文件表,unix,system,filetable,Unix,System,Filetable,我对Unix系统文件表感到困惑 当两个或多个进程打开一个文件进行读取时,系统文件表是为每个进程创建单独的条目还是为单个条目创建单独的条目 如果为打开同一文件的多个进程创建一个条目,它们的文件偏移量是否也相同 如果process1打开file1.txt进行读取,而process2打开同一个文件file1.txt进行写入,系统文件表会创建一个或两个条目吗 有三个“系统文件表”:有一个文件描述符表,用于将文件描述符(小整数)映射到打开的文件表中的条目。打开文件表中的每个条目都包含(除其他外)一个文件

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

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

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

  • 如果
    process1
    打开
    file1.txt
    进行读取,而
    process2
    打开同一个文件
    file1.txt
    进行写入,系统文件表会创建一个或两个条目吗

有三个“系统文件表”:有一个文件描述符表,用于将文件描述符(小整数)映射到打开的文件表中的条目。打开文件表中的每个条目都包含(除其他外)一个文件偏移量和一个指向内存中inode表的指针。这是一张照片: (来源:)

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

回答您的问题:

  • 当两个或多个进程打开一个文件进行读取时,每次打开时,打开文件表中都有一个条目。如果一个进程多次打开文件,则每次打开都会有一个条目

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

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

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

    这是从

    先生,这怎么可能是复制品?他问的是亲子关系和fork之类的问题,我的问题是不同,我们的问题是关于打开的文件和进程;另一个问题是关于打开的文件和
    fork
    。进程由
    fork
    系统调用创建。因此,它们本质上是相同的问题。有打开的文件表和内存中的索引节点表。。。这两个都是“系统”文件表,因为它们由系统(OS)维护。你的问题是关于打开文件的,所以必须是关于前者,而不是后者。据我所知,至少有三个表。文件描述符表、系统文件表和内存索引节点表这张图显示,如果两个不同的进程打开一个文件,计数器将在打开的文件表(我认为是系统文件表)中递增。所以我认为系统文件表的行为same@Alfred不,它没有显示这一点。正如我所说的,当条目被复制或进程被分叉时(这就是为什么会有两个进程指向同一个打开的文件表条目)——也就是当打开的文件条目计数器递增时,条目被共享。我已经给了你答案;如果您认为这是错误的,请发布您自己的问题答案。@Alfred再次注意,每个
    open
    调用有一个打开的文件表条目,每个打开的文件在内存中有一个inode表条目。。。如果两个进程打开同一个文件,则后者将使其计数递增。