1

これが私の更新されたコードスニペットです

for (int i=0; i<30; i++){

        printf("Forking\n");

        tmpPid = fork();

        switch(tmpPid)

       {
         case -1:

            printf("Error");
            break;
         case 0:

          printf("Fork success for proc %d\n", i);
          //call some function
           _exit(0)
           break;

         default:

         printf("Fork succeed");
         //store the pid in a vector
          break;
    }
}

//iterate through the vector and wait on each process.
// waitpid(vectorList[i], &exitStatus, WNOHANG)

ほぼ 15 ~ 18 の子プロセスの fork は正常に機能します。しかし、一部のプロセスでは、子コードがまったく実行されず、子プロセスがハングするだけです。(つまり、fork() は子 ID のみを返しますが、ゼロは返しません)。他のダミー関数を呼び出して for ループ内でより多くの時間を購入すると、この問題は見られません。誰が何が問題なのか教えてもらえますか? 複数のフォークの間に遅延を置く必要がありますか?

ありがとう

4

3 に答える 3

1

プログラムが最初に意図したことを実行するかどうかはわかりません。

基本的

  for (i=0 ; i<N ; i++) {
      print("Forking\n");
      fork();
  }

あくまで理屈つきN == 30です。

  • for i == 29:親がforループを終了して死ぬ
  • for i == 28:はまだ29を行う必要があり、も同様です ...

等...

表示される 30 個の「Forking」の代わりに、「Forking」が表示されます2^0+2^1+2^2+...+2^29

つまり、2^N-1または2^30 - 1、または1,073,741,823フォーク。

OS によっては、ulimit / system / window / user / shell のいずれかの制限に達してシステムが不平を言い、ハングする可能性があります。

多分

  for (i=0 ; i<N ; i++) {
      print("Forking\n");
      if (fork()) exit(0);
  }

またはスニペットでは、子供たちdefault:を死なexit(0);せる必要があります(恐ろしい言葉)が意図した結果を提供します。

于 2013-01-15T10:55:43.467 に答える
1

親プロセスが強制終了されると、子プロセスも強制終了されます。したがって、子プロセスが作業を完了するまで待機するように親プロセスに通知する必要があります。waitプログラムでorを使用waitpidします。

wait子プロセスのいずれかが終了するまで、呼び出しプロセスをブロックします。

waitpid最初の引数で言及された子プロセスが終了するまで、呼び出しプロセスをブロックします。

于 2013-01-15T10:56:27.417 に答える
0

一部の子プロセスは、親が停止する前に印刷する時間がない場合があります。

wait親プロセスを終了する前に、子プロセスを終了する必要があります。

また、複数の子プロセスが同じ出力ストリームに同時に書き込みを行うという問題が発生する可能性もあります。(これが潜在的な問題であることを誰かが確認できますか?)

于 2013-01-15T10:40:57.900 に答える