2012-02-29 11 views
1

特定の信号に対してユーザ定義のハンドラ関数が指定されています。この信号を受信すると、ハンドラ関数が呼び出されます。ハンドラ関数は、ユーザ空間またはカーネル空間で実行されますか? または、一般に、任意のシグナルに対するアクションは、ユーザー空間またはカーネル空間で実行されますか?シグナルハンドラはカーネルまたはユーザ空間で実行されますか?

答えて

5

ハンドラはユーザー空間で実行され、プロセスの仮想アドレス空間にのみアクセスできます。

もちろん、Cの標準は "user"と "kernel"について何も知らない。

4

信号ハンドラはユーザ空間で実行する必要があります。カーネル空間で実行された場合、カーネルはすべてのプロセスを制御できるため、マシン全体で何かにアクセスすることができます。その結果、悪意のあるプログラムは他のプログラムのメモリを壊したり、データを盗み出したり、信号を送信するだけで悪化したりする可能性があります。

4

一般に、信号はユーザ空間で実行されます。しかし、C言語標準は実際にユーザーとカーネル空間の間の分離を定義していないので、そうでないC言語の実装が考えられることが考えられます。

しかし、WindowsではUnixのすべてのフレーバで、が保証されており、ユーザ空間ではが保証されています。

+0

シグナルハンドラは、C言語仕様の一部でもありません。私はこれがC言語仕様の外にあると思います。 –

+2

@AdamMihalcin:C言語の仕様では、実際に 'signal()'と 'raise()'関数と 'SIGABRT'、' SIGFPE'、 'SIGILL'、' SIGINT'、 'SIGSEGV'と' SIGTERM '。 – caf

+0

@caf K&Rをチェックするように私に説得してくれてありがとう。あなたは正しい。 –

0

カーネルはユーザ空間に信号を送ることができますが、その逆もありません。また、送信されるデータ量は非常に限られており、シグナルハンドラはユーザ空間で実行されます。

説明:

ユーザ空間にカーネル空間からの信号を送信できるようにするために、カーネルはユーザ空間のプロセスのpidを知っている必要があります。カーネルモジュールがpidを受信するとすぐに、対応するプロセス記述子を探し、それにシグナルを送ります。信号に関連するすべての情報はstruct siginfoに保存されます。

ユーザスペースプロセスは、シグナルハンドラ機能をカーネルに登録します。これにより、シグナルハンドラ関数のアドレスがプロセス記述子に追加されます。この関数は、特定のシグナルが配信されるたびに実行されます。

関連する問題