- 论坛徽章:
- 0
|
- else if(pid == 0) //创建第一个子进程成功,fork调用成功返回后,现在有两个不同的进程,
- { //它们之间具有父子关系,但父子进程中的global.var是分属两个
- //进程地址空间内的不同的东西,如果发生变量的修改,在COW机制
- //的作用下,系统会为进行变量修改的那个进程分配物理存储页面,
- // fork系统调用的结果就是生成两个除了某些进程特征外完全相同
- //的映像, 由于代码段不会被修改,所以可以父子进程共享,
- //而数据和堆栈段,就是每个进程所独有的,为了进行性能优化,
- //系统采用COPY ON WRITE(修改时复制)的机制进行数据段堆栈段
- //的复制.
-
- //这时,父进程和子进程中的global,var变量的虚拟地址相同,
- //但实际上位于不同的物理存储页面上.
- //对一个进程的变量的修改并不会影响到另一个进程中的变量.
-
- if( (pid_child=fork()) < 0) //执行到这条语句之前时,父子进程中global和var的值还是相同的
-
- {
- err_sys("child fork error");
- }
- // fork调用成功返回时,又多出一个子进程,系统为第二个子进程进行数据段和堆栈段的赋值.
- printf("child fork \n"); //到此时,系统内共存在3份glob和var的拷贝,每一份分属一个
- //进程,在一个进程内修改不会也不可能影响到其它进程中的
- //数据
- glob ++; //第一个子进程和第一个子进程的子进程修改各自的glob和var.
- var ++;
- sleep(1);
- }
复制代码
不太明白 第2次fork()后 程序怎么执行的
你需要搞清楚地是fork如何执行. |
|