当我们对当前进程进行 fork 时,我们的进程作为父进程会生成具有相同特征但不同进程 ID 的子进程。因此,之后,当我们在子进程中执行 exec() 时,进程会停止执行,而在停止的子进程中执行的程序现在拥有自己的进程。
这不是和我们运行应用程序时一样吗,特别是之后每个应用程序都有自己的进程和PID?
答案1
是的,因为这就是 UNIX 中的工作方式。
没有“运行应用程序”系统调用;它总是由 fork/exec 对完成。
顺便说一下,exec
确实不是生成新的PID。exec
取代进程的内容——内存被丢弃,并加载一个全新的可执行文件——但内核状态保持不变(打开的文件、环境变量、工作目录、用户等),并且 PID 保持不变。
如果您有兴趣,请进一步阅读:
vfork
就像fork
除了它必须始终与 , 配对,并且在无法工作exec
时很有用,例如在 ucLinux 中。fork
clone
是新的fork
(今天的fork
函数clone
在幕后使用),但做了更多的事情,包括创建新的进程分享相同的内存(而不是重复它,比如fork
),我们称之为线程。