1

我有一个问题。按照惯例,unix 为每个进程的 stdin、stdout、stderr 关联文件描述符 0、1、2。文件(例如标准输入指向的文件)是否由不同进程共享?如果是共享的,当我们打开两个 shell 向这两个 shell 输入一些输入时,操作系统如何管理共享文件?

4

1 回答 1

4

概述

描述符表是每个进程的,因此系统中的每个进程都可能在每个描述符表插槽中打开不同的文件

但在实践中它有点复杂。如果两个进程独立打开一个文件,那么它们每个都对文件具有完全独立的访问权限,具有自己的读写指针,并且只有当它们都写入同一个文件时它们才会交互。

但是当一个进程 fork(2) 的时候,父子描述符指向同一个文件表条目,因此它们在文件中共享一个位置。这使 Unix 进程能够共享对输入流的访问,而无需了解情况。

三张桌子

对文件的访问是通过 Unix 中的三个重要表链接起来的。描述符表是每个进程的并且指向文件表。将文件表视为打开的文件表。还有第三个表,最初称为inode 表,用于管理对实际文件的访问。

要意识到的关键是,虽然任何一个文件的 inode 表中的条目永远不会超过一个,但文件表中可能有也可能没有多个条目。如果一个文件描述符是用 open(2) 创建的,那么 inode 会得到一个新的文件表条目,但是如果它是用 fork(2) 创建的,那么相同的文件表条目会被重用,并且读写指针是共享的。

所以,两个贝壳...

如果两个 shell 有两个不同的输入窗口,或者两个 shell 运行不同的脚本,那么它们根本不使用同一个文件,或者如果它是同一个脚本,它被打开了两次,所以它们的位置是独立的。两者都可能是每个进程中的文件描述符“0”,但这是因为每个进程都有自己的描述符表。

于 2010-09-28T20:35:53.590 回答