父子进程:
通过fork创建进程后我们需要对其返回值结果,划分子进程和父进程的专属代码区,当fork返回值大于0是为父进程的代码区,等于0时为子进程代码区,小于0则创建进程失败
从图中可以看出除了if语句中pid==0和pid>0时分别只由子进程和父进程单独执行,还有fork语句由父进程执行外,其他区域都是共同的代码块。
那么请问当子进程执行自己专属代码区时,改变的num值结果会不会影响父进程中num的值呢?
这里答案是不会的,父子进程的代码执行遵循 读时共享,写时拷贝。
读时共享:
当子进程对变量num不进行修改操作时,子进程并不会复制父进程的地址空间,而是和父进程共享一块地址空间。
写时拷贝:
父进程执行部分和子进程执行部分都会对变量num进行操作,但是父进程和子进程对变量num的操作是独立的、互不相干的,此时便需要子进程复制父进程的地址空间,然后父、子进程在各自空间中对变量num进行操作,如下代码示例:
红蓝框分别代表父子进程要执行的代码,父子进程分别对num进行写操作,父进程加10,子进程加100,右边结果可以看出父进程先执行 (进程间执行顺序不定),在父进程专属代码区打印出的值为20,然后子进程在专属代码区打印值为110,还是在源num=10基础上加100,可以看出子进程是拷贝了一份父进程的地址,父子进程对num的操作相互独立并不影响。
执行完各自专属代码区后,打印出来num=20,num=110, 也分别是父进程和子进程各自地址空间中的num值,故上述观点成立。