fork()是UNIX或类UNIX中的分叉函数,fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。
其函数原型为:
当调用fork()时,将执行以下动作:
- 向系统申请一个新PID
- 创建子进程,复制父进程的PCB,获得父进程的数据空间、堆、栈等资源的副本
- 在父进程中返回子进程的PID,在子进程中返回0
执行完以上动作后,父进程和子进程便开始并发执行了。
有以下几点需要说明:
1、创建子进程后,父进程和子进程开始执行的起点
当父进程调用fork()后,fork()得到一个新的PID并进行复制副本、复制PCB等一系列子进程的准备工作后,此时父子两个进程将并发执行,这时候共有两个fork()存在,父子进程中都在等待着fork()函数的最后一步:返回值。这时候父进程中的fork()将返回子进程的PID,而子进程中的fork()返回0,此时可以引出下一个问题
2、为什么fork()函数可以做到返回两个值(说好的子进程是父进程的副本呢?)
由于子进程在创建时几乎复制了父进程的一切,自然也就包括了父进程的堆栈段,fork(&#