为什么 shell 会调用 fork()?

use*_*885 35 command-line process

当一个进程从 shell 启动时,为什么 shell 在执行进程之前会自己fork?

例如,当用户输入时grep blabla foo,为什么shell 不能在exec()没有子shell 的情况下调用grep?

此外,当 shell 在 GUI 终端仿真器中分叉自身时,它是否会启动另一个终端仿真器?(比如pts/13开始pts/14

sha*_*anu 37

当您调用exec家族方法时,它不会创建新进程,而是exec用您要运行的进程替换当前进程内存和指令集等。

例如,您想grep使用 exec运行。bash是一个进程(它有单独的内存、地址空间)。现在,当您调用 时exec(grep),exec 将用数据替换当前进程的内存、地址空间、指令集等grep's。这意味着bash过程将不再存在。因此,您在完成grep命令后无法返回终端。这就是 exec 系列方法永远不会返回的原因。exec 后不能执行任何代码;它是无法到达的。

  • [指令集](http://en.wikipedia.org/wiki/Instruction_set) 有非常具体的含义。这不是你使用它的意义。 (7认同)
  • 顺便说一句,您*可以*通过使用命令`exec grep blabla foo` 告诉bash 执行grep 而不先分叉。当然,在这种特殊情况下,它不会很有用(因为只要 grep 完成,您的终端窗口就会关闭),但它偶尔会很方便(例如,如果您正在启动另一个 shell,也许通过 ssh / sudo / screen,并且不打算返回到原来的那个,或者如果你正在运行它的 shell 进程是一个永远不会执行多个命令的子 shell)。 (2认同)