Jsevillamol Asked: 2018-02-01 02:22:05 +0800 CST2018-02-01 02:22:05 +0800 CST 2018-02-01 02:22:05 +0800 CST 为什么分叉进程之间共享文件描述符? 772 当我们fork()一个进程时,子进程继承文件描述符。问题是,为什么? 正如我所看到的,当每个进程都试图跟踪 r/w 指针的位置时,共享文件描述符是一件令人头疼的事情。 为什么做出这个设计决定? file-descriptors fork 2 个回答 Voted ilkkachu 2018-02-01T03:31:45+08:002018-02-01T03:31:45+08:00 考虑一个 shell 片段 { somecmd; othercommand *.txt; } > outputfile shelloutputfile在开始重定向时打开一次,然后将文件句柄传递给somecmdand othercmd,然后处理它fork。考虑到分组,用户期望两个命令的输出都以 . 结尾可能没有错,outputfile就像它们最终出现在屏幕上一样。{ }(如果该组是一个 shell 脚本,那将是相同的。) 如果文件位置对于所有进程都是独立的,则来自的输出othercommand将破坏somecmd. 如果fork重置文件句柄上的位置,shell 将无法传递othercommand指向末尾的句柄outputfile(因为它是 after somecmd)。我们必须使用管道来收集两个命令的输出(它们与位置无关),并让另一个程序连接这两个命令的输出: { somecmd; othercommand *.txt } | cat > outputfile Best Answer Stephen Kitt 2018-02-01T02:40:55+08:002018-02-01T02:40:55+08:00 POSIX解释了这样的推理: POSIX 程序员调用fork()有两个原因。一个原因是在同一个程序中创建一个新的控制线程(这最初只能在 POSIX 中通过创建一个新进程来实现);另一种是创建一个运行不同程序的新进程。在后一种情况下,对fork()的调用很快就会调用其中一个exec函数。 当fork()用作“穷人的线程”时,复制文件描述符是有意义的。必须继续支持该用例,因此此功能将保留...
考虑一个 shell 片段
shell
outputfile
在开始重定向时打开一次,然后将文件句柄传递给somecmd
andothercmd
,然后处理它fork
。考虑到分组,用户期望两个命令的输出都以 . 结尾可能没有错,outputfile
就像它们最终出现在屏幕上一样。{ }
(如果该组是一个 shell 脚本,那将是相同的。)如果文件位置对于所有进程都是独立的,则来自的输出
othercommand
将破坏somecmd
. 如果fork
重置文件句柄上的位置,shell 将无法传递othercommand
指向末尾的句柄outputfile
(因为它是 aftersomecmd
)。我们必须使用管道来收集两个命令的输出(它们与位置无关),并让另一个程序连接这两个命令的输出:POSIX解释了这样的推理:
当
fork()
用作“穷人的线程”时,复制文件描述符是有意义的。必须继续支持该用例,因此此功能将保留...