2011-06-19 3 views
1

C:のprintf()(フォークで)次のコードで

int i = 1; 
fork(); 
i=i*2; 
fork(); 
i=i*2; 
fork(); 
i=i*2; 

printf("%d\n", i); 

8,8,8,8,8,8,8,8が印刷されず1,2,2,4,4,8,8,8ているなぜですか? fork()はプロセスを複製し、各forkの前にiを出力します。私は何が恋しい?

+3

すべての単一のプロセスは、 'i'に対して同じ正確な操作を行います。最後にそれぞれ同じ値が表示されます。 –

+0

のようにはなりませんか?printf( "%d \ n"、i); –

答えて

2

は、あなたが6の8つのたくさん見てする必要があります(あなたは、最後の計算にi = i + 2;の代わりi = i * 2;を書いた。

各プロセスが同じコードパスをたどるので、各プロセスは同じ結果になります。私はprobl存在しないと仮定してい

int i = 1; 
if (fork()) 
{ 
    i=i*2; 
    if (fork()) 
    { 
     i=i*2; 
     if (fork()) 
      i=i*2; // + --> * 
    } 
} 
printf(|%d\n", i); 

あなたが期待する結果を得るには、各fork()は親や子プロセスを生成したかどうかを追跡する必要があると思いますfork()操作のem。また、条件の一部または全部を逆転させ、同じ結果をもたらす可能性があることにも興味があります。

0

フォークはコードが下に行くにつれてコードを実行し続けるためです。したがって、各プロセスは毎回i = i * 2を実行し、より多くの子を生成します。獲得したものと期待したものではない(つまり、一度フォークされたブロックの最後にはジャンプしません)。フォークの

情報:http://www.csl.mtu.edu/cs4411/www/NOTES/process/fork/create.html

0

それぞれの新しいプロセスはそうすぐに、親と子の両方が私のために同じ値を持つ)(フォークを呼び出した後、親のスタックのコピーを取得します - 「しかし、彼らはドン同じのスタックを持っています.1つのプロセスでiの値を変更しても、他のプロセスに影響はありません。

2つの並列コードが同じメモリを共有するようにするには、スレッド(およびスタックにないヒープにあるメモリ)を使用するか、明示的な共有メモリ領域を使用します。示されたコードを考える

関連する問題