当我们是fork()
一个进程时,子进程继承文件描述符。问题是,为什么?
正如我所看到的,当每个进程都试图跟踪 r/w 指针的位置时,共享文件描述符是一件令人头痛的事情。
为什么做出这个设计决定?
答案1
考虑一个 shell 片段
{ somecmd; othercommand *.txt; } > outputfile
shelloutputfile
在启动重定向时打开一次,然后将文件句柄传递给somecmd
and othercmd
,处理它fork
。考虑到分组,用户期望这两个命令的输出最终都以 结尾outputfile
,这可能是正确的,就像它们最终在屏幕上一样。 (如果{ }
组是 shell 脚本,情况会是一样的。)
如果文件位置对于所有进程都是独立的,则 的输出othercommand
将破坏somecmd
.如果fork
重置文件句柄上的位置,则 shell 将无法传递othercommand
指向 末尾的句柄outputfile
(因为它位于 之后somecmd
)。我们必须使用管道来收集两个命令的输出(无论如何它们都是与位置无关的),并让另一个程序连接两个命令的输出:
{ somecmd; othercommand *.txt } | cat > outputfile