1. 主进程在fork出一个子进程后,会将自己4G的空间复制一份给子进程(包括代码段、数据段、堆、栈),代码段共享同一物理内存,因为子进程中的代码和父进程中的代码是一样的,只是对pid有一个判断,才会走不同的分支;
输出:
红框中的代码在父进程和子进程都有一份,他们是一样的,只是他们通过判断是父进程还是子进程,走不同的分支,所以最后sleep后面的printf会打印两次(可能是子进程的pid先打印,也可能是父进程中的pid先打印)。
2. 子进程中的数据段、堆、栈虽然是复制了父进程中的,但它也可以有自己的数据段、堆、栈(就是在判断pid等于0时,可以定义属于自己的全局变量、局部变量等),所以说不共用同一物理内存,所以子进程操作这些数据段、堆、栈段仅对自己可见
输出:
父进程中的栈段变量i会拷贝一份到子进程中,子进程会把它放在自己栈段,当父进程对i进行++操作时,子进程中的i不会被影响,子进程加100操作,父进程也不会被影响到。虽然复制后在虚拟地址空间他们的虚拟地址是相同的,但他们最后都是修改到自己的映射到的物理内存中;在子进程的数据段定义了一个变量j,这个变量仅对自己可见,父进程不能访问这个变量;
如果打开主进程的注释,编译时会报如下错误:
标签:fork,变量,布局,pid,内存空间,栈段,内存,进程 From: https://www.cnblogs.com/zj-studyrecoding/p/17134357.html