当我在 unix shell 中输入时find
,是否会创建一个新进程(来处理 find 操作)?为什么?
答案1
是的,一般来说 find
不是内置命令,因此 shell 将通过调用fork()
该exec()
命令来产生一个新进程。
答案2
有可能(可能),但不一定。如果您之前输入过:
$ find() { :; }
那么当您输入 时不会创建新进程find
。相反,shell 将调用函数,这是一个无操作。但是,如果您没有定义这样的函数,没有为 设定别名,并且中存在find
名为 的可执行文件,那么 shell 将(几乎肯定)派生一个新进程。(“几乎肯定”是因为你很可能正在使用一个作为内置命令实现的 shell ,尽管我不知道有任何 shell 这样做。)find
PATH
find
答案3
所有外部命令都会创建进程(即使用 fork())。例如 find、grep、cp、mv 等。只有内部命令不使用 fork()(例如 cd、pwd 等)。甚至在一些著名的书籍中,内部命令也被定义为不生成任何进程的命令。
答案4
你还问过为什么创建了新流程。
在 Unix 上运行程序涉及用程序的映像替换当前进程的内存映像;这是通过exec()
系统调用系列完成的。当程序完成时,进程终止。如果我们没有派生一个新进程,就不会再有 shell 进程运行来显示新提示符并让您运行更多命令。
因此,shell 会派生一个子进程,然后这个子进程会执行该程序。同时,原始 shell 进程会等待该进程终止。或者,如果您使用 结束命令&
,shell 不会等待 - 这就是我们在后台运行程序的方式(我大大简化了,但这是要点)。