运行“find”命令是否会分叉一个新进程?

运行“find”命令是否会分叉一个新进程?

当我在 unix shell 中输入时find,是否会创建一个新进程(来处理 find 操作)?为什么?

答案1

是的,一般来说 find不是内置命令,因此 shell 将通过调用fork()exec()命令来产生一个新进程。

答案2

有可能(可能),但不一定。如果您之前输入过:

$ find() { :; }

那么当您输入 时不会创建新进程find。相反,shell 将调用函数,这是一个无操作。但是,如果您没有定义这样的函数,没有为 设定别名,并且中存在find名为 的可执行文件,那么 shell 将(几乎肯定)派生一个新进程。(“几乎肯定”是因为你很可能正在使用一个作为内置命令实现的 shell ,尽管我不知道有任何 shell 这样做。)findPATHfind

答案3

所有外部命令都会创建进程(即使用 fork())。例如 find、grep、cp、mv 等。只有内部命令不使用 fork()(例如 cd、pwd 等)。甚至在一些著名的书籍中,内部命令也被定义为不生成任何进程的命令。

答案4

你还问过为什么创建了新流程。

在 Unix 上运行程序涉及用程序的映像替换当前进程的内存映像;这是通过exec()系统调用系列完成的。当程序完成时,进程终止。如果我们没有派生一个新进程,就不会再有 shell 进程运行来显示新提示符并让您运行更多命令。

因此,shell 会派生一个子进程,然后这个子进程会执行该程序。同时,原始 shell 进程会等待该进程终止。或者,如果您使用 结束命令&,shell 不会等待 - 这就是我们在后台运行程序的方式(我大大简化了,但这是要点)。

相关内容