– Child duplicate of parent – Child has a program loaded into it
在第一个情况中,描述了当一个子进程(child)被创建时,它是父进程(parent)的一个精确副本。这意味着父进程和子进程的地址空间是相同的,在内存中包含同样的程序和数据(Program A 和 Data A)。
在第二个情况中,它说明了子进程刚开始是父进程的副本,但之后在子进程的地址空间中加载了一个不同的程序(Program B)和数据(Data C)。这表明父进程和子进程现在不同,因为它们包含不同的内存数据和程序代码。
<aside> 💫 UNIX examples
</aside>
fork()
**后,会创建一个子进程。子进程是父进程的副本,但有自己的唯一进程标识符(PID)。fork()
返回新创建的子进程的PID(在这个例子中是11),而在子进程中,fork()
**返回0。fork()
**的返回值,进程可以知道它是父进程还是子进程。exec()
**用于替换调用它的进程的内存空间中的程序,即用一个新的程序替换当前执行的程序。exec()
**替换了原有的程序A为程序B。这个调用不改变进程的PID,但程序的代码和数据会被新程序替换。完整过程梳理:
fork()
:
fork()
**系统调用,操作系统创建子进程。子进程获得一个新的PID,并且是父进程的副本。exec()
:
exec()
系列函数之一来替换其地址空间中的程序。exec()
**不会改变PID,但会加载一个全新的程序到子进程的地址空间中。此时,子进程开始执行新程序。wait()
**,暂停执行,等待一个或多个子进程完成。exec()
加载的新程序后,通过exit()
**系统调用终止,并将退出状态返回给操作系统。exit()
后从wait()
**返回,操作系统会提供子进程的退出状态给父进程。父进程可以使用这个信息来判断子进程是否成功完成了其任务。