-1

在 unix 中执行“cat 文件名 | grep 诗 | wc -l ”命令时将使用多少个进程。会不会有1个进程,2个进程,3个进程……来执行上面的命令。

4

2 回答 2

2

它实际上取决于外壳。在 bash 中应该有 3 个进程。我在后台运行了 3 个睡眠来代替这些命令,然后跑pstree了。这就是我得到的:

> sleep 4s | sleep 4s | sleep 4s & pstree
 │         ├─bash───bash─┬─pstree
 │         │             ├─3*[sleep]

在子外壳中:

> ( sleep 4s | sleep 4s | sleep 4s ) & pstree
 │         ├─bash───bash─┬─bash───3*[sleep]
 │         │             ├─pstree

更新:

这并没有正确展示 bash 在执行管道时的行为,因为将它们放在后台会影响执行的子 shell 的数量。我建议在前台运行它们,然后在观察时检查另一个终端中的进程数。Bash 可以通过防止不必要地使用子外壳来优化管道的执行,可能在较新的版本中。

于 2013-09-13T20:33:58.057 回答
1

管道从第一个进程获取输出流,并将其作为下一个进程的输入流。您可以保证每个命令都有一个进程,但是每个进程都可能根据它们的操作创建子进程。

于 2013-09-13T20:20:44.033 回答