1

次の C コードで作成されたプロセスの数を把握しようとしています。

int main ()
{
   fork();
   if (fork()) {
      fork();
   }
   fork();
   return 0;
}

私が混乱していることがいくつかあります:

fork() が呼び出されるたびに、子はコードの最初から開始しますか、それとも現在の fork() が作成した場所から開始しますか? たとえば、3 行目の最初の fork が呼び出された場合、4 行目または 1 行目で子を開始しますか? これはばかげた質問だと思います。b/c 各子が最初から開始した場合、無限ループが作成されますが、この仮定については安全を期したいと思います。

次に、fork が呼び出されると、現在のプロセスが 2 つの新しいプロセスに分割され、1 つが親で、もう 1 つが子になりますか、それとも現在のプロセスが自動的に親になるので、実際には 1 つの余分なプロセスが作成されます。

最後に、if ステートメントを使用すると、fork が実際に親の場合は親 ID の値を返し、子の場合は常に 0 を返すと確信しています。では、生成されたすべての子に対して if ステートメントが false になると仮定するのは正しいでしょうか?

上記のすべての仮定に基づいて、これが私が思いついたプロセス ツリーです。ツリー内の子の数は、フォークが現在発生しているコード行を表します。

        main
  |    |    |    |
  3    4    5    7    // the main/initial process calls fork 4 times
| | |  |    |    
4 5 7  7    7         // the first fork will see 3 additional forks since it was called
| |                   // at line 3 and I assume resumes at line 4.
7 7                   // The second and third original children would each only callthe
                      // very last fork().  The last fork has no other forks following.

したがって、合計 10 個のプロセスが作成されます (main を含む)。私はそれを間違っていましたか?

4

3 に答える 3

1

(1) の直後の行fork

(2) 1 つの新しいプロセス。子は親のコピーです。

(3)親に子のforkpid を返し、子に 0 を返します。if ステートメントは、すべての子に対して false になります。12プロセスに出てくるはずです。私はグラフを描くのが苦手ですが、あなたはそれを理解できるはずです。

于 2013-09-17T03:07:47.770 に答える
0

Q: fork() が呼び出されるたびに、子はコードの先頭から開始しますか? それとも、現在の fork() が作成した場所から開始しますか?

A: 「fork()」以降の文より。

Q: fork が呼び出されたとき、現在のプロセスは分割されますか (その結果、新しいプロセスになりますか?)

A: はい。

Q: fork は実際に親の場合は親 ID の値を返し、子の場合は常に 0 を返しますか?

A: はい。プロセスの作成中にエラーが発生した場合を除き、エラーが発生した場合は -1 が返されます。

詳細については、ここを参照してください。

于 2013-09-17T03:15:52.283 に答える