for循环中的C程序派生命令

时间:2014-09-16 14:11:58

标签: c ubuntu for-loop fork

我正在编写一个使用fork命令并循环10次的C程序,同时,每个循环中都会显示进程ID。

以下是我的代码:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

main ()
{ int x;
  for(x=0;x<10;x++)
  {
   fork();
   printf("The process ID (PID): %d \n",getpid());
  }
}

我的代码生成了大量的进程ID,程序中有什么问题吗?

2 个答案:

答案 0 :(得分:5)

fork()系统调用会创建一个子节点,该子节点执行与父节点相同的代码。从那一刻起,有两个进程执行下一行:父和子。他们每个人都执行printf()

第二次执行for循环时,它由父和子执行:每个循环都执行fork(),所以从那一刻开始4个过程:第一个过程和他们的新孩子。

因此,对于循环中的每次迭代,您都会将进程数量增加一倍。因此,进程总数为2 ^ 10 = 1024。

因此,执行printf()循环中的for

  • 前两个流程的10次
  • 他们的孩子9次(2个过程)
  • 下一代8次(4个新生儿)
  • 下一次(8个孩子)7次
  • 下一个(16个孩子)6次
  • 下一次(32个孩子)的5次
  • 下一次(64个孩子)的4次
  • 下一次(128名儿童)的3次
  • 下一个(256个孩子)的2次
  • 最后一次(512名儿童)的1次

总计:10 * 2 + 9 * 2 + 8 * 4 + 7 * 8 + 6 * 16 + 5 * 32 + 4 * 64 + 3 * 128 + 2 * 256 + 1 * 512 = 2046。

printf()执行了2046次。

答案 1 :(得分:0)

检查我的例子

  pid_t pID = fork();
       if (pID == 0)                // child
       {
          // Code only executed by child process

          sIdentifier = "Child Process: ";
          globalVariable++;
          iStackVariable++;
    }
        else if (pID < 0)            // failed to fork
        {
            cerr << "Failed to fork" << endl;
            exit(1);
            // Throw exception
        }
        else                                   // parent
        {
          // Code only executed by parent process

          sIdentifier = "Parent Process:";
        }

        // Code executed by both parent and child.