2017-10-05 20 views
0

なぜ22行目の印刷結果が3ではなく1になるのですか? countはグローバル変数で、handlerAで既に変更されています。なぜ21行目と22行目にその値を保持しなかったのですか?フォークとグローバル変数との混乱

1 pid_t pid; 
2 int count = 0; 
3  
4 void handlerA(int sig) { 
5  count += 2 
6  printf("count = %d\n", count); 
7  fflush(stdout); 
8  kill(pid, SIGUSR1); 
9 } 
10 
11 void handlerB(int sig) { 
12  count += 3; 
13  printf("count = %d\n", count); 
14  fflush(stdout); 
15  exit(0); 
16 } 
17 
18 int main() { 
19  signal(SIGUSR1, handlerA);  
20  if ((pid = fork()) == 0) { 
21   count++; 
22   printf("count = %d\n", count); 
23   fflush(stdout); 
24   signal(SIGUSR1, handlerB); 
25   kill(getpid(), SIGUSR1); 
26   while (1) {}; 
27  } 
28  else { 
29   wait(); 
30   count += 4; 
31   printf("count = %d\n", count); 
32   fflush(stdout); 
33  } 
34  return 0; 
35 } 
+0

"既に変更されています"どのように? – Ryan

+0

はすでに2でインクリメントされています – stumped

+0

おそらく 'man 2 fork'" *子プロセスと親プロセスは別々のメモリ空間で実行されます* "つまり、" *子プロセスは親プロセスの正確な複製です。 。* "が作成されますが、別のメモリ空間に作成されます。したがって、フォーク時にグローバルの値を継承しますが、それ以降は他のプロセスによって更新されません。 –

答えて

4

私は混乱がsignal()端を発するいると思う:それは単にSIGUSR1を処理するためにhandlerAを設定している機能です。

信号が呼び出されていないか、タイムライン22によって何らかの方法でトリガーされたハンドラーがありません。プログラムはfork()countを0から1までインクリメントします。

kill(pid, SIGUSR1);mainのどこかのフォークの前にある場合は、期待している動作が表示されます。

信号のそれぞれのハンドラの内部で信号を再発生させないでください。