0

SIGABRT シグナルを処理するシグナル ハンドラで問題に直面しています。そのため、誰かが SIGABRT を受け取った後は、他のスレッドは実行できません。これにより、プログラムの不適切なクラッシュが発生します。ただし、SIGSEGV の処理中は、適切にスケジュールされ、他のスレッドを実行できます。

シグナルを受信すると、いくつかの回復メカニズムを別のスレッドにポストします。sigsegv の場合は実行されますが、SIGABRT の場合はスレッド自体がスケジュールされていないため実行されません。

参考までに: 150 を超えるスレッドを持つプロセスに優先度ベースの RR スケジューリングを使用しています。

4

1 に答える 1

3

ABRT 信号はブロックできません。ハンドラーをインストールできますが、ハンドラーは戻ってはなりません (つまり、通常はstd::exitまたはを呼び出してプロセスを終了する必要があります_Exit)。返された場合、シグナルが再び発生し、デフォルトのハンドラーがインストールされます (これによりプログラムが終了します)。

対照的に、SEGV はキャッチ、処理、およびブロックできる通常のシグナルですが、典​​型的な SEGV の根本的な原因を修正することはできないため、賢明に回復することはできません。ただし、その間にも多くのコードを実行できます。

于 2012-10-09T16:07:52.127 に答える