zoukankan      html  css  js  c++  java
  • 菜鸟fork()创建进程新见解

    从一个简单的fork()查找自己的不足:
    int mian()
    {
          pid_t pid1;

          pid_t pid2;
      
          pid1  =  fork();
         
          pid2  =   fork();
         
          printf("pid1=%d,pid2=%d\n",pid1,pid2);
    }

    题目要求:
    已知从程序执行到这个程序的所有进程结束的时间段内,没有其他任何新进程运行;
    1.请说出这个进程执行后一共有几个进程?
    2.如果其中一个进程的输出结果是“pid1=1001,pid2=1002”,写出其它的进程执行结果(不考虑进程的执行顺序)。

    执行结果:
              首先这里一共有四个进程,这是容易想到的;
    输出结果:
              pid1=1001, pid2=0
              pid1  =  0,   pid2=1003
              pid1  =  0,   pid2=0

    分析结果:

    解题

          下面利用上文阐述的知识进行解题。这里我把两个问题放在一起进行分析。

          1、从shell中执行此程序,启动了一个进程,我们设这个进程为P0,设其PID为XXX(解题过程不需知道其PID)。

          2、当执行到pid1 = fork();时,P0启动一个子进程P1,由题目知P1的PID为1001。我们暂且不管P1。

          3、P0中的fork返回1001给pid1,继续执行到pid2 = fork();,此时启动另一个新进程,设为P2,由题目知P2的PID为1002。同样暂且不管P2。

          4、P0中的第二个fork返回1002给pid2,继续执行完后续程序,结束。所以,P0的结果为“pid1:1001, pid2:1002”。

          5、再看P2,P2生成时,P0中pid1=1001,所以P2中pid1继承P0的1001,而作为子进程pid2=0。P2从第二个fork后开始执行,结束后输出“pid1:1001, pid2:0”。

          6、接着看P1,P1中第一条fork返回0给pid1,然后接着执行后面的语句。而后面接着的语句是pid2 = fork();执行到这里,P1又产生了一个新进程,设为P3。先不管P3。

          7、P1中第二条fork将P3的PID返回给pid2,由预备知识知P3的PID为1003,所以P1的pid2=1003。P1继续执行后续程序,结束,输出“pid1:0, pid2:1003”。

          8、P3作为P1的子进程,继承P1中pid1=0,并且第二条fork将0返回给pid2,所以P3最后输出“pid1:0, pid2:0”。

          9、至此,整个执行过程完毕。

          所得答案:

          1、一共执行了四个进程。(P0, P1, P2, P3)

          2、另外几个进程的输出分别为:

          pid1:1001, pid2:0

          pid1:0, pid2:1003

          pid1:0, pid2:0

  • 相关阅读:
    java基础知识--环境变量配置
    安装oracle11g时遇到INS-13001环境不满足最低要求
    MINA系列学习-IoBuffer
    MINA系列学习-mina整体介绍
    DBCP数据源连接池实现原理分析
    dbcp数据源配置杂谈
    Java 内存区域和GC机制分析
    网站的防盗链与反盗链的那点事
    这一天博客小院我进来了!
    AOP
  • 原文地址:https://www.cnblogs.com/cy568searchx/p/2633553.html
Copyright © 2011-2022 走看看