2017-03-23 6 views
0
int counter = 0; 
int main() 
{ 
    int i; 
    for (i = 0; i < 2; i ++){ 
     fork(); 
     counter ++; 
     printf("counter = %d\n", counter); 
} 
    printf("counter = %d\n", counter); 
    return 0; 
} 

counterには7つのprintfsしか得られません。複数のフォークを使用したステートメントの印刷

どうすればいいですか?counterを10回印刷しますか?

は私が視覚的に持っているもの厥:

     ____1____2__ 
        | 
      _____fork |____1____2__ 
      |  __________1____2___ 
      |fork| 
      | | 
main__fork|____|_____________2_____ 

The numbers 1 and 2 represent `counter` printed by `printf`. Could anyone explain this (visually would be great) ? 

答えて

1

あなたは、各プロセスが終了する直前に、余分な時間を出力することを忘れています。

たとえば、最初のプロセスは "counter = 0"、 "counter = 1"、 "counter = 2"を出力し、終了する前に余分な "counter = 2"を出力してループを終了します。

printfにPIDとどちらが含まれているかを変更すると、コードがわかりやすくなります。printfです。ループ内

、カウンタ= 1、PID =ループ内11755
、カウンタ= 2、PID = 11755
出口ループ、カウンタ= 2、PID =ループ内11755
、カウンタ= 1、PID = 11756
ループ内 、カウンタ= 2、PID = 11756
出口ループ、カウンタ= 2、PID = 11756
ループ内 、カウンタ= 2、PID = 11758
出口ループ、カウンタ= 2、PID = 11758
ループ内、カウンタ= 2、pid = 11757
出口ループ、カウンタ= 2、PID = 11757

+0

私は理解しないどんな、例えば、なぜ最初のフォークでプリント1及び2と、ループ後にもう一回2。 2inループが私に混乱しています。 – ssss

+1

@ssssもし 'fork()'コールを無視した場合(あるいはコメントアウトしてプログラムを実行すると)、プログラムは1 2 2を表示します。それに言いました。 – immibis

関連する問題