菜鸟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

原文地址:https://www.cnblogs.com/cy568searchx/p/2633553.html