我有一个问题。按照惯例,unix将stdin,stdout,stderr的文件描述符0,1,2与每个进程相关联。是文件,例如由stdin指出,由不同的进程共享?如果共享,当我们打开两个shell来为这两个shell输入一些输入时,操作系统如何管理共享文件?
答案 0 :(得分:4)
描述符表是按进程的,因此系统中的每个进程都可以在每个描述符表槽中打开不同的文件
但实际上它有点复杂。如果两个进程独立地打开一个文件,那么它们每个进程都有完全独立的文件访问权限,只有它们自己的读写指针,只有当它们都写入同一个文件时才会进行交互。
但是当进程fork(2)的时候,父和子的描述符指向同一个文件表条目,因此它们在文件中共享一个位置。这使Unix进程可以共享对输入流的访问,而无需了解情况。
通过Unix中的三个重要表链接访问文件。 描述符表是按进程并指向文件表。将文件表视为打开文件表。还有第三个表,最初称为 inode表,用于管理对实际文件的访问。
要实现的关键是,虽然inode表中对于任何一个文件都不会有多个条目,但文件表中可能有也可能没有多个条目。如果使用open(2)创建文件描述符,则inode获取新的文件表条目,但如果使用fork(2)创建,则重用相同的文件表条目,并共享读写指针。
如果两个shell有两个不同的窗口用于输入,或者两个shell运行不同的脚本,那么它们根本不使用相同的文件,或者如果它是相同的脚本,则它被打开两次,因此它们的位置是独立。两者在每个进程中都可能是文件描述符“0”,但这是因为每个进程都有自己的描述符表。