fork() 和 exec() 混淆

Jun*_*ior 3 linux debian fork exec

当我们对当前进程进行 fork 时,我们作为父进程的进程会生成具有相同特征但进程 ID 不同的子进程。所以在那之后,当我们在我们的子进程中执行 exec() 时,进程停止执行,并且我们在停止的子进程中执行的程序现在有了自己的进程。

这与我们运行应用程序时每个应用程序都有自己的进程和 PID 时不一样吗?

ams*_*ams 7

是的,因为在 UNIX 中就是这样做的。

没有“运行应用程序”系统调用;它总是由 fork/exec 对完成。

顺便说一下,exec不会产生新的PID。exec 替换进程的内容——丢弃内存,加载一个全新的可执行文件——但内核状态保持不变(打开文件、环境变量、工作目录、用户等),PID保持不变相同的。


进一步阅读,如果你有兴趣:

  • vfork就像fork必须始终与 配对exec,并且在fork无法工作时很有用,例如在 ucLinux 中。

  • clone是新的fork(今天的fork函数clone在幕后使用)但做了更多的事情,包括创建共享相同内存的新进程(而不是复制它,如fork),我们称之为线程。

  • 当您按 Enter 键时,您的 shell 进程运行 fork 以创建一个新进程,然后新的 fork 进程使用您编写的命令运行 exec。 (3认同)
  • @Vassilis,它不是*重复*,而是*共享*。唯一的复制是内核中的几个页表。如果子进程尝试写入内存,那么内存才会被复制,并且仅针对那一页(我认为大约 4k)。 (3认同)