2016-09-20 27 views
0
{ 
    if(fork() && fork()) 
    { 
     fork(); 
    } 

    if(fork() || fork()) 
    { 
     fork(); 
    } 

    printf("hello"); 
    return 0; 
} 

私はfork()がここでどのように動作するかを取得していないですし、何回ハローが印刷されます。
私はちょうどfork() && fork()が1つの親に対して合計3つのプロセスを生成することを知っています。同様に、1つの親に対して3つのプロセスが生成されます。ここでfork()はどのように動作しますか?

最初のif条件の後、3つのプロセスが作成され、親プロセスのみがifブロックに入ります。現在、合計4つのプロセスが存在します。さて、さらに進む方法、私は完全にこれに苦しんでいますか?

可能であれば、ツリー図を表示してください。最初のブロックについて

+0

デバッガを使用してプログラムを実行します。また、関連するシステムコールを理解するには、[strace(1)](http://man7.org/linux/man-pages/man1/strace.1.html)(おそらく '-f'オプション付き)を使用します。ところで、あなたの質問は宿題のように見えます。ですから、[フォーク(システムコール)](https://en.wikipedia.org/wiki/Fork_%28system_call%29)、そしてhttp://advancedlinuxprogramming.com/ –

+0

BTWの関連する章を慎重に読んで、 'printf '文を' printf( "hello in%d parent%d \ n"、(int)getpid()、(int)getppid());また、プログラムの先頭に 'printf(" start pid%d \ n "、getpid());を追加すると、多くの手助けが必要になります。 –

+0

最後に、ローカル変数に 'fork'の結果を明示的に保持する必要があります。失敗に対して' fork'をテストする必要があります。 –

答えて

1

ツリーの視覚化!

if(fork() && fork()) 
{ 
    fork(); 
} 

First if block

今、私たちは、システム内で実行されている4つのプロセスを持っています。 P,C1,C2およびC3

そして、それぞれがブロックすると、次は実行されます。合計で

if(fork() || fork()) 
{ 
    fork(); 
} 

Second if block

我々は、システムで実行4 * 5 = 20工程を有し、それぞれが "こんにちは" を印刷します。

3

if(fork() && fork()) 
{ 
    fork(); 
} 

子プロセスは0を受信した場合にスキップし、親が条件を計算するために進みます。親は次のforkを実行し、ifブロックを入力して再びforkします。したがって、3つのフォーク呼び出しがあり、4つのプロセスが発生します。

これらの4つのプロセスはすべて、次のブロックを実行します。 1つを見てみましょう:

if(fork() || fork()) 
{ 
    fork(); 
} 

私たちは一度フォークします。子は0以外の値を受け取り、条件結果はすでに真であるため、条件の第2部分を評価せずにそこに入ります。したがって、すでに2つのフォーク呼び出しがあります。親プロセスは、式の2番目のフォークを評価しなければならず、その子プロセスはifとforkを再び入力します。したがって、さらに2つのフォーク呼び出し。合計4つのコールにより、5つのプロセスが実行されます。

したがって、最初のブロックからの4つのプロセスのそれぞれが2番目のブロックの5つのプロセスにフォークし、合計で4 * 5 = 20のプロセスとなります。そして、それぞれが "こんにちは"を印刷します。

+0

あなたは2番目の部分を精巧にできますか? – Garrick

+1

あなたは本当にそれを自分自身でやろうとするべきです。論理式は遅れて評価されることに留意してください。 –

+0

ありがとう!私は木の方法でそれを視覚化した。 – Garrick

関連する問題