用叉子的空循环导致奇怪的行为

时间:2013-09-22 21:42:32

标签: c for-loop fork

我希望这个程序从0到5打印i,但它只打印一次迭代。但是,如果我注释掉父项的for循环,它会打印出预期的结果......会导致什么结果?

int main(){
    int pid;
    int i=0;
     for(i=0;i<5;i++){
        printf("i: %d\n",i);
        pid = fork();
        if(pid < 0){
            printf("Error forking\n");
        } else if(pid == 0){
            //child
            for(i=0;i<10;i++);
            exit(1);
        } else {
            //parent
            for(i=0;i<10;i++);
            //exit(1); 
        }
    }
}

3 个答案:

答案 0 :(得分:3)

您始终在i循环中访问相同的变量for,尤其是在“内部”循环中:

for(i=0;i<10;i++);

将它们改为这样的独立循环:

int j;
for(j=0;j<10;j++);

那为什么它只执行一次迭代呢?由于i在相应的内部循环之后具有值10(在两个进程中),因此外部循环i < 5的条件当然将评估为false

答案 1 :(得分:1)

由于空循环,父进程和子进程都将i设置为10。因此,当下一个“outter”迭代即将发生时,我是10,所以循环条件不正确。

答案 2 :(得分:1)

我建议对您的计划进行以下更改:

int main(void)
{
  for(int i=0;i<5;i++) {
    printf("i: %d\n",i);

    pid_t pid = fork();
    if(pid < 0) {
      perror("Error forking\n");
    } else if(pid == 0) {
      //child
      for(int j=0;j<10;j++) {
        ;
      }
      exit(EXIT_FAILURE);
    } else {
      //parent
      for(int j=0;j<10;j++) {
        ;
      }
      exit(EXIT_FAILURE); 
    }
  }
}