2009-07-10 10 views
2

カーネル内でプロセスを強制終了するのは誰ですか?"kill"はどのように機能しますか?そして、特に、ブロックされたプロセスの "殺し"はどのように機能しますか?

"kill"が発生し、プロセスがブロックされた状態になるとどうなりますか?プロセスは、自分自身をきれいにするために状態を実行するまで来るのを待つか?

killコマンドのSIGINTが生成されたときのように、誰かがカーネルに関してもっと答えることができれば、最終的にTCB(タスク制御ブロック)がクリアされるまでカーネルが何を呼び出すのでしょうか?

答えて

7

私はあなたがSIGKILLについて話していると推測しているので、私はその議論だけをその信号に限定します。

プロセスが別のプロセスでSIGKILLを発生させると、SIGKILLが犠牲プロセスで保留中のシグナルとして追加され、保留中のSIGSTOP、SIGTSTP、SIGTTOU、またはSIGTTINシグナルがすべてクリアされます。犠牲者は、停止している場合、または割り込み可能なスリープ状態になっている場合に目覚め(実行可能に)されます。

次に、ターゲットプロセスがカーネルモードからユーザーモードに移行しようとすると、保留中のシグナルがチェックされます。これは保留中のSIGKILLが見つかった場所で、カーネルはユーザーモードに戻る代わりにdo_exit()を呼び出します。

カーネルモードからユーザモードへの移行は、プロセスが次にスケジュールされるときに行われます(無停止スリープ状態でない限り、これは悪名高いD状態です)。中断されていないスリープ状態にある場合、そのプロセスは目を覚ますまでユーザーモードに戻りません。

1

killを実行すると、プロセス(TERM)にシグナルを送信して終了するようにうながします。それはそれがそれのビジネスだと応答しない場合。ただし、several different signalsのいずれかを送信するように選択できます。あなたが興味を持っているのはkill -9(SIGKILL)です。

(編集:コメントで指摘したとおり、TERMがデフォルトです)

+0

こんにちはJoeslice、私はカーネルの面でもっと尋ねました、誰がSIGINTを選ぶでしょう、カーネルの "Mr. ABC process"が信号を受け取ったときに何がすべて画像に入りますか? –

+0

いいえ、 'kill'はデフォルトで' SIGTERM'を送ります。これは 'SIGINT'ではなく、終了するシグナルです –

+0

@ChristofferHammarström:そうです!ありがとう。私はその回答を明確にした。 – joeslice

0

キリング(というよりも中断)は通常(CTRL-Cは、SIGINTを送信)UNIXシステムにSIGKILL信号によって行われます。

これらのシステムは通常、シグナルによってブロッキングシステムコールを中断する方法を提供します。これにより、システムコールが完了するのを待たずにシグナルハンドラが実行されます(EINTRエラーが発生します)。したがっては通常です。コールは完了するのを待たずにキャンセルされました。

5

SIGKILL以外の信号でそれを強制終了すると、シグナルが送信されます。これはマスクすることも無視することもできますが、そうでない(またはマスクされていない)と仮定すると、プログラムの通常の実行を中断します。

IPCタイプのシステムコール(例えば、ソケットからの読み取り、select()、poll()、sleep()など)が中断され、errnoのEINTRで失敗します。適切に書かれたアプリケーションは、信号を処理した後にコールを再発行します。

このプロセスは、シグナルハンドラへの呼び出しをすぐに実行します。シグナルハンドラは、処理を続行できるように戻るか、longjmp(C言語)を呼び出すか、プロセスを終了します。通常はデフォルトです。

SIGKILLはまったく異なりますが、上記のいずれも発生しません。その代わりに、システムコールを終了するだけです(EINTRがプロセスを読み込めるようになっている場合は、errnoにEINTRが残っていると思われます)。

しかし、私は "D" "中断されないスリープ"状態が終了するのを待っていると思います。これは通常、ブロックディスク読み取り、ページフォールト要求負荷などのようなものです。

+0

longjmp()は非同期セーフではないため、シグナルハンドラから呼び出さないでください。 – sigjuice

+0

'SIGSTOP'はマスクも無視もできません。 – ephemient

+0

sigjuice:とにかくシグナルハンドラからlongjmpを呼び出す人がいるかもしれません:) – MarkR

0

各プロセスが処理するのではなく、いくつかのプロセスに配信されるのではなく、「Proceessスケジューラは、」プロセスを終了無視することができ、信号、多くの種類を受け取ることができます.... は、より詳細な説明のためにこれを見 http://www.linux-tutorial.info/modules.php?name=MContent&pageid=289

関連する問題