1

現在、私は UNIX ベースのオペレーティング システムに関するいくつかの演習を行っています。fork() システム コールを使用して子プロセスを作成しました。コード スニペットは次のとおりです。

if(!fork())
{
   printf("I am parent process.\n");
}
 else
   printf("I am child process.\n");

そして、このプログラムは最初に子プロセスを実行し、次に親プロセスを実行します。

しかし、if(!fork()) by if(fork()!=0) を置き換えると、親ブロックが実行され、次に子ブロックが実行されます。前もって感謝します!!

4

5 に答える 5

3
  • 実行の保証された順序はありません。
  • ただし、論理的には逆の結果if(!fork())if(fork()!=0)られます。ゼロを返す場合はtrueで、falseはtrueです。fork()!fork()fork()!=0

また、fork()のマニュアルページから:

成功すると、子プロセスのPIDが親に返され、0が子に返されます。失敗すると、親に-1が返され、子プロセスは作成されず、errnoが適切に設定されます。

したがって、正しいチェックは

pid_t pid = fork();
if(pid == -1) {
     // ERROR in PARENT
} else if(pid == 0) {
     // CHILD process
} else {
     // PARENT process, and the child has ID pid
}

編集:Wyzardが言うように、後でpidを使用することも確実に確認する必要があります。(また、型をintではなくpid_tに修正しました。)

于 2012-08-05T15:21:22.773 に答える
1

どちらも実際には使用しないでください。子が終了すると、親も終了するまでゾンビとして残ります。子のpidを変数にキャプチャし、それを使用して子の終了ステータスを取得する必要があります。

pid_t child_pid = fork();
if (child_pid == -1)
{
  // Fork failed, check errno
}
else if (child_pid)
{
  // Do parent stuff...

  int status;
  waitpid(child_pid, &status, 0);
}
else
{
  // Child stuff
}

または、「ダブルフォークトリック」を使用して子を親から分離し、子が親が終了ステータスを取得するのを待っているゾンビとして留まらないようにする必要があります。

また、フォークの後で親の前に実行されている子に依存することはできません。同時に実行されている2つのプロセスがあり、実行の相対的な順序は保証されていません。それらは交代で実行される場合もあれば、異なるCPUコアで同時に実行される場合もあります。

于 2012-08-05T15:22:47.437 に答える
0

!fork()fork() == 0どちらも同じように動作します。

条件自体が、実行シーケンスが異なる理由になることはありません。プロセスがレプリケートされます。これは、CPU を含むリソースについて、子が親と競合することを意味します。どのプロセスが CPU を取得するかを決定するのは OS スケジューラです。

于 2012-08-05T15:14:33.797 に答える
0

親と子がそれぞれのprintf()ステートメントに到達する順序は定義されていません。テストを何度も繰り返した場合、どちらのバージョンでも親が最初に印刷され、親が最後に印刷されるという点で、両方の結果が似ている可能性があります。

于 2012-08-05T15:16:23.313 に答える
0

子プロセスと親プロセスが実行される順序は、スケジューラによって決定されます。各プロセスがプロセッサによって実行される時期と期間を決定します。そのため、同じプログラム コードでも、出力の順序が異なる場合があります。ソース コードの変更によって出力シーケンスが変更されたのは、まったくの偶然です。ところで、あなたの printf はちょうど逆であるべきです: fork() が 0 を返すなら、それは親プロセスではなく子プロセスです。

http://en.wikipedia.org/wiki/Fork_%28operating_system%29でコード例を参照してください。この記事のドイツ語版 (http://de.wikipedia.org/wiki/Fork_%28Unix%29) には、サンプル出力と操作シーケンスに関する短い説明が含まれています。

于 2012-08-05T15:40:05.940 に答える