使用循环来分叉不同数量的孩子

puk*_*puk 3 c fork multiprocessing

大部分时间我遇到展示如何叉,像这样的例子:

main()
{
    int    pid;

    pid = fork();
    // child
    if (pid == 0)                
    {
        ...
    }
    // Parent
    else if (pID > 0)            
    {
        ...
    }
Run Code Online (Sandbox Code Playgroud)

}

有些人展示了如何分叉2个孩子,就像这样

pid = fork();
// Child
if ( pid==0 )
{
   ...
}

// Parent
else if ( pid>0 )
{
   pid=fork();

   // Second child
   if ( pid==0 ){
      ...
   }

}
Run Code Online (Sandbox Code Playgroud)

这是我试图分叉5个孩子......

pid = fork();
// Child
if ( pid==0 )
{
   ...
}

// Parent
else if ( pid>0 )
{
   pid=fork();

   // Second child
   if ( pid==0 ){
      ...
   }

   // Parent
   else if ( pid>0 )
   {
      pid=fork();

      // Third child
      if ( pid==0 ){
         ...
      }
      // Parent
      else if ( pid>0 )
      {
         pid=fork();

         // Fourth child
         if ( pid==0 ){
            ...
         }
         // Parent
         else if ( pid>0 )
         {
            pid=fork();

            // Fifth child
            if ( pid==0 ){
               ...
            }
         }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

题:

我的观点是,这是精神错乱.是否有更简洁的方法来循环并创建不同数量的子节点(即通过命令行参数指定)?

注意: 孩子们将自己区分开来是非常重要的(即写下"嗨,我是6号孩子"......)因为我的工作涉及每个过程发信号通知不同的计算机.目前我正在使用信号量和一系列目标计算机.我更想要的是为进程增加indeces 1..N.

Joh*_*136 8

使用for循环.每个进程都将获得它自己的循环变量副本.

int pid;
int numKids = 5;
int procNum;

for(procNum = 0; procNum < numKids; procNum++) {
    // Note: haven't included error handling...
    pid = fork();
    if (pid == 0) {
        break;
    }
}

if (pid == 0) {
    // child specific stuff. procNum is set to the "child number"
}
else {
    // parent stuff
}
Run Code Online (Sandbox Code Playgroud)

  • 不,每个孩子都会得到它自己的副本,所以你需要确保孩子们打破循环,否则你最终会让每个孩子产生更多的孩子并重置"pid",这样他们就像父母那样...... (2认同)