0

カーネルでシグナリング(割り込み)メカニズムはどのように処理されますか?私が尋ねる原因は次のとおりです。どういうわけかSIGABRT信号が私のアプリケーションによって受信され、それがどこから来ているのかを知りたいのです。

4

2 に答える 2

6

カーネルではなく、アプリケーションで原因を調べる必要があります。

通常、プロセスはSIGABRT、直接呼び出しabortたとき、またはassert失敗したときに受信します。信号を配信するカーネルの一部を正確に見つけても、何も得られません。

結論として、あなたのコードまたはあなたのコードが使用しているライブラリがこれを引き起こしています。abort(3)およびを参照してくださいassert

于 2011-07-13T14:00:17.613 に答える
1

cnicutarの答えは私見の最良の推測です。

信号が別のプロセスによって発行された可能性がありますが、SIGBARTの場合、abort(3)libc関数を介して信号を受信する同じプロセスによって発行される可能性が最も高くなります。

疑わしい場合は、でアプリケーションを実行して、そのシステムコールがプログラムまたは依存ライブラリ内から実際に呼び出されてstrace -e kill yourapp you args ...いるかどうかをすばやく確認できます。killまたは、gdbを使用しますcatch syscall

SIGKILL悪名高い「OOMキラー」が動作したときなど、カーネル自体が信号を発する場合があることに注意してください。

ところで、シグナルは非同期で配信され、プログラムの通常のワークフローを混乱させます。これが、彼らが追跡するのが苦痛な理由です。SystemTapなどの機械以外に、カーネル内での信号の放出と配信を追跡またはログに記録する方法がわかりません。

于 2011-07-13T21:33:25.260 に答える