进程创建 fork()
在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。
使用fork()需要包含 #include<unistd.h>
fork(void) 的返回值类型为 pid_t
给父进程返回创建成功的子进程的PID(进程号),给子进程返回 0。
代码举例:
结果:
由输出结果我们看到,在代码 if 和 else if 中的语句都被执行了,这貌似和我们之前的认知不同,两个相反的逻辑块中的代码都被执行了。
这是因为在fork()之后,代码有两个执行流,分别执行父子进程的逻辑块。
在上面的例子中, 在父进程中的fork()给父进程中的ret返回子进程PID:11020,而给子进程返回0,所以在往下走就执行不同的逻辑块。
注意:在默认情况下,父子进程共享所有代码(包括fork()之前的代码),”数据私有“(这个私有是打引号的,具体原因会在后面的写时拷贝中解释)
既然父子进程代码共享,父进程从fork后继续执行代码可以理解,但为什么子进程也从子进程也称fork()后面开始执行???
因为子进程成功创建后,子进程的PCB程序控制中保存的有父进程PCB中程序计数器中的将要执行的下一步指令信息,所以说虽然父子进程的代码一样,但是不是从头开始执行的,都是从fork()之后开始执行。
为什么父子进程的代码要共享???
我们要知道进程的代码属于逻辑框架,是不可被修改的,能修改的知识数据部分。而且系统是在页表上对物理内存中的访问设置的是只读权限,所以代码就是只能读不能改。那么如果代码不共享,父子进程各自私有代码,那么就需要给子进程新开辟空间重新存放一份与父进程一模一样的代码,造成资源浪费。
为什么父子进程的数据私有???
<