因此,当从外壳中触发命令时,fork()会继承它的子进程,而exec()会将子进程加载到内存中并执行。
不完全的。 fork()
克隆当前进程,创建一个相同的子进程。 exec()
将新程序加载到当前进程中,以替换现有程序。
我的qs是:
如果子进程包含父进程(原始进程)的所有属性,那么该子进程有什么需求?原始进程也可能已加载到内存中。
这是因为父进程还不想终止。它希望新流程能够启动并在继续执行的同时做一些事情。
这个fork和exec的概念适用于UNIX中的所有可执行程序吗?还是像shell脚本一样,或者仅像命令一样?它也适用于shell内置命令吗?
对于外部命令,shell会执行一个操作,fork()
以便命令在新进程中运行。内置程序仅由外壳程序直接运行。另一个值得注意的命令是exec
,它exec()
无需先通知外壳即可将其告知外部程序fork()
。这意味着外壳本身已被新程序替换,因此不再存在该程序在退出时返回的程序。如果你说exec true
,然后/bin/true
将取代你的shell,并立即退出,留下没有在你的终端上运行了,那么它将会关闭。
如果我要执行命令/脚本,何时使用写时复制概念?
回到石器时代,fork()
实际上不得不将调用过程中的所有内存复制到新过程中。写时复制是一种优化,其中建立了页表,以便两个进程开始共享所有相同的内存,并且仅在需要时才复制两个进程写入的页面。