1

我希望这个程序打印 i 从 0 到 5,但它只打印一次迭代。但是,如果我注释掉父级的 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); 
        }
    }
}
4

3 回答 3

3

您总是ifor-loops 中访问相同的变量,尤其是在“内部”变量中:

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

将它们更改为类似这样以具有独立循环:

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

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

于 2013-09-22T21:45:21.133 回答
1

由于空循环,父进程和子进程都将 i 设置为 10。因此,当下一次“外部”迭代即将发生时,i 为 10,因此循环条件不成立。

于 2013-09-22T21:47:27.407 回答
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); 
    }
  }
}
于 2013-09-22T21:53:49.510 回答