1

このプログラムは i を 0 から 5 まで出力すると思いますが、1 回の繰り返ししか出力しません。ただし、親の 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

特に「内側」のループでは、常に同じ変数iにアクセスしています。for

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

それらを次のように変更して、独立したループを作成します。

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

では、なぜ正確に 1 回の反復しか実行しないのでしょうか? iそれぞれの内側のループの後に (両方のプロセスで)値があるため10、外側のループの条件はi < 5もちろん に評価されfalseます。

于 2013-09-22T21:45:21.133 に答える
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 に答える
1

ループが空であるため、親プロセスと子プロセスの両方が i を 10 に設定します。そのため、次の「外側」の反復が行われるとき、i は 10 であるため、ループ条件は真ではありません。

于 2013-09-22T21:47:27.407 に答える