这句话指的是fork
和exec
系统调用¹。该fork
系统调用创建通过复制调用进程的新进程:运行之后fork
,有两个过程,每个都有自己的memory¹与除返回值最初,内容相同的fork
系统调用,进程ID和其它差别很少. 该exec
系统调用从文件中装载,并替换了由图像现有进程的内存中的程序映像。
通常意义上的程序运行方式是调用fork
创建一个新进程供程序运行,然后调用exec
子进程用新程序的代码和数据替换原来程序的副本。这是最常见的用法fork
(通常在之前完成一些事情,exec
例如设置文件重定向)。
exec
不做 afork
就运行可以看作是对做fork
+exec
并让父级在exit
之后立即做的优化。它并不完全等效,因为fork
+ exec
/exit
更改了结果程序的父级,而直式exec
则没有。
Linux 的进程标志 1 表示没有调用的进程,exec
因为它们是由其父进程分叉的,即程序原始进程的子进程(或孙子进程等)。呼叫fork
而不呼叫exec
有多种用途。(这不是一个详尽的列表,只是一些常见的用例。)
fork
实现子shell(脚本的一部分,其中变量、重定向等不影响主脚本)。fork
,然后父进程退出。这是exec
我上面提到的“优化”的逆过程,这样做是为了将守护进程与其原始父进程隔离,特别是为了避免在等待其子进程完成时阻塞原始父进程(例如,当您在没有&
) 的情况下在 shell 中运行程序。¹有一些细微差别在这里无关紧要,超出了本答案的范围。