免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4233 | 回复: 12
打印 上一主题 下一主题

在fork的子进程中fork? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-20 15:39 |只看该作者 |倒序浏览
#include<sys/types.h>
#include<unistd.h>
#include"apue.h"
#include"unix_err.h"

int glob = 6;
char buf[] = "a write to stdout\n";

int main()
{
        int var;
        pid_t pid;
        pid_t pid_child;

        var = 88;
        if(write(STDOUT_FILENO,buf,sizeof(buf)-1) != sizeof(buf)-1)
        {
                err_sys("write error");
        }
        printf("before fork\n");

        if( (pid=fork()) < 0 )
        {
                err_sys("fork error");
        }
        else if(pid == 0)
        {
                if( (pid_child=fork()) < 0)
                {
                        err_sys("child fork error");
                }
                printf("child fork \n");
                glob ++;
                var ++;
                sleep(1);
        }
        else
                //printf("sleep\n");
                sleep(4);
        printf("pid=%d, glob=%d, var=%d fork_id=%d ppid=%d\n", getpid(), glob, var, pid, getppid());
        //printf("uid=%d euid=%d gid=%d egid=%d\n", getuid(), geteuid(), getgid(), getegid());

        exit(0);
}


程序执行后
272$ a.out
a write to stdout
before fork
child fork
child fork
pid=1198, glob=7, var=89 fork_id=0 ppid=1197
pid=1199, glob=7, var=89 fork_id=0 ppid=1
pid=1197, glob=6, var=88 fork_id=1198 ppid=590

请问 glob 和 var 为什么只 自增了一次呢?

论坛徽章:
0
2 [报告]
发表于 2006-09-20 15:52 |只看该作者
你觉得要自增几次?你代码上只让它增一次,当然结果就是一次了!

论坛徽章:
0
3 [报告]
发表于 2006-09-20 16:30 |只看该作者
不是 在
pid == 0
的时候  第二次 fork()了吗?
第二次fork()没有 开启新进程吗?

我看 书上在解决僵死进程的时候 用到了 2次fork()
但是 第2次  fork() 后 马上用了 eixt(0)

不太明白 第2次fork()后 程序怎么执行的

论坛徽章:
0
4 [报告]
发表于 2006-09-20 17:15 |只看该作者
自增了两次啊

但是对于每一个进程来说,只自增了一次麻

论坛徽章:
0
5 [报告]
发表于 2006-09-20 17:24 |只看该作者


  1.         else if(pid == 0)       //创建第一个子进程成功,fork调用成功返回后,现在有两个不同的进程,
  2.         {                              //它们之间具有父子关系,但父子进程中的global.var是分属两个
  3.                                         //进程地址空间内的不同的东西,如果发生变量的修改,在COW机制
  4.                                         //的作用下,系统会为进行变量修改的那个进程分配物理存储页面,
  5.                                         // fork系统调用的结果就是生成两个除了某些进程特征外完全相同
  6.                                         //的映像, 由于代码段不会被修改,所以可以父子进程共享,
  7.                                         //而数据和堆栈段,就是每个进程所独有的,为了进行性能优化,
  8.                                         //系统采用COPY ON WRITE(修改时复制)的机制进行数据段堆栈段
  9.                                         //的复制.
  10.                                          
  11.                                         //这时,父进程和子进程中的global,var变量的虚拟地址相同,
  12.                                         //但实际上位于不同的物理存储页面上.
  13.                                         //对一个进程的变量的修改并不会影响到另一个进程中的变量.
  14.                                           
  15.                 if( (pid_child=fork()) < 0) //执行到这条语句之前时,父子进程中global和var的值还是相同的
  16.                                                         
  17.                 {
  18.                         err_sys("child fork error");
  19.                 }
  20.                  // fork调用成功返回时,又多出一个子进程,系统为第二个子进程进行数据段和堆栈段的赋值.
  21.                 printf("child fork \n");       //到此时,系统内共存在3份glob和var的拷贝,每一份分属一个
  22.                                                         //进程,在一个进程内修改不会也不可能影响到其它进程中的
  23.                                                          //数据

  24.                 glob ++;                //第一个子进程和第一个子进程的子进程修改各自的glob和var.
  25.                 var ++;
  26.                 sleep(1);
  27.         }
复制代码


不太明白 第2次fork()后 程序怎么执行的

你需要搞清楚地是fork如何执行.

论坛徽章:
0
6 [报告]
发表于 2006-09-20 17:28 |只看该作者
好象 有点明白了。。。
就是说 每个进程的数据空间是独立的?

论坛徽章:
0
7 [报告]
发表于 2006-09-20 17:32 |只看该作者
to:coldwarm
太厉害了!!非常透彻。。
to: all
谢谢 各位 大侠。

论坛徽章:
0
8 [报告]
发表于 2006-09-20 19:19 |只看该作者
原帖由 fan2290 于 2006-9-20 17:28 发表
好象 有点明白了。。。
就是说 每个进程的数据空间是独立的?


完全是拷贝,拷贝完了只修改一下process info,最多再指定一下parent pid,设置signal等等

论坛徽章:
0
9 [报告]
发表于 2006-09-20 19:52 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
10 [报告]
发表于 2006-12-20 20:19 |只看该作者
coldwarm:...................................
                 
           你需要搞清楚地是fork如何执行
请问,你能说一下fork是如何执行的吗?我一直有个地方迷惑:都说代码段是共享的,那么,fork的调用不是每生成一个子进程,都会再次执行fork,这样下去,不是一直在fork吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP