9つのプロセスで構成されるこのマルチプロセスプログラムがあります。1 つは、3 つのシグナル生成プロセスと 4 つのシグナル処理プロセスを生成するメイン プロセスです。1つは監視プロセスです。ここで、SIGUSR1 と SIGUSR2 の 2 つのシグナルを使用しました。各ハンドラーは、SIGUSR1 または SIGUSR2 のいずれかを処理できます。シグナルを受信するたびに、共有メモリ内のシグナル SIGUSR1 および SIGUSR2 のカウントを 1 増やします。シグナルはプロセス グループに送信されるため、監視プロセスもシグナルを受信します。両方のシグナルを処理でき、ローカルシグナルカウントを 1 増やします。10 に達するたびに、共有メモリ内の SIGUSR1 と SIGUSR2 のカウントの値を出力します。
このオプションはメイン プログラムにあり、30 秒間実行してプログラムを終了することができます。この場合、sleep(30) を実行してからプログラムを終了します。2 番目のケースでは、共有メモリ内の SIGUSR1 と SIGUSR2 の合計数をカウントしながら、while ループでビジー状態で待機します。100000 に達すると、プログラムを終了します。
2つのバージョンの私の出力は次のとおりです
100000秒版の場合
100000信号版出力用
Initializing the shared memory
End of initializing the shared memory
Registering the signal handlers
End of registering the signal handlers
Registering the monitoring process
Monitor's pid is 6635
End of registering the monitoring process
Registering the signal generators
Interval SIGUSR1 = 5.79953e-05
Interval SIGUSR2 = 8.69632e-05
Count SIGUSR1 = 10
Count SIGUSR2 = 10
Count SSIGUSR1 = 5
Count SSIGUSR2 = 5
Interval SIGUSR1 = 7.64132e-05
Interval SIGUSR2 = 5.72999e-05
Count SIGUSR1 = 16
Count SIGUSR2 = 24
Count SSIGUSR1 = 8
Count SSIGUSR2 = 12
30秒バージョンの場合
共有メモリの初期化
End of initializing the shared memory
Registering the signal handlers
End of registering the signal handlers
Registering the monitoring process
Monitor's pid is 6719
End of registering the monitoring process
Registering the signal generators
Inside option 1
Interval SIGUSR1 = 0.000246763
Interval SIGUSR2 = 0.000222743
Count SIGUSR1 = 93
Count SIGUSR2 = 222
Count SSIGUSR1 = 92
Count SSIGUSR2 = 111
Interval SIGUSR1 = 0.000664711
Interval SIGUSR2 = 0.000390577
Count SIGUSR1 = 102
Count SIGUSR2 = 234
Count SSIGUSR1 = 97
Count SSIGUSR2 = 117
2番目のケースで結果が遅れるのはなぜですか。つまり、モニターが最初に出力を出力したとき、処理スレッドによって記録された SIGUSR1 と SIGUSR2 のカウントは、すでに 93 と 222 に達していました。また、シグナルはプロセス グループに送信されます。したがって、各シグナルは 2 つのハンドラーと 1 つのモニターによって処理されます。ハンドラーの場合は 2 つだけです。4 つのハンドラーのうち 2 つが SIGUSR1 を処理し、他のシグナルを無視し、その逆も同様であるためです。
したがって、sleep(30) を実行して結果を確認すると、何が問題なのかがわかります。あらゆる洞察。これを何日もデバッグしようとしていますが、まだ成功していません。