- ベストアンサー
killコマンドの終了と強制終了の違いについて
私は、SUNのSolaris8を使っています。 現在動いているプロセスを、killコマンドを使って終了させる際に、 -9または-KILLオプションを付けると、強制終了を行いますよね。 そこで質問なのですが、そもそもプロセスの『終了』と『強制終了』の違いとは何ですか? とっても初歩的な質問だとは思いますが、いまいち理解できません。 よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
いわゆる unix には、「シグナル」というイベント通知の仕組みがあります。 あるプロセスに対して、シグナルが送信されると、そのプロセスは、やっている 処理を中断して、シグナルハンドラという特別に割り当てられた処理を行います。 kill コマンドというのは、このシグナルの送信をするコマンドに他なりません。 シグナルは、番号でイベントを区別でき、何種類もあり、それぞれの番号毎に 意味が割り当てられています。 シグナルハンドラは、自分で作って登録することもできますが、その登録を行わない ときには、それぞれのシグナルに「デフォルトの動作」が割り当てられています。 デフォルトの動作は、無視・コア・終了・停止の4種類あります。 シグナルの中で9(SIGKILL)だけは、ちょっと特別で、シグナルハンドラの登録が 無視されます。なので、このシグナルを送信することで、対象のプロセスを無条件に 終了させることが保証されています。 これを簡単に言うと「強制終了」ですね。 他にも、デフォルトの動作が「終了」シグナルがあります(例えば、1や2)。 こいつらも送信すると対象のプロセスは終了するのですが、シグナルハンドラを 登録することができるので、そのプロセスの作り方によっては終了しないことが ありえます。 > そもそもプロセスの『終了』と『強制終了』の違いとは何ですか? 普通にプロセスが終了する場合、というのは exit システムコールを呼んだのと 同じなんですが、シグナルのデフォルトの動作での「終了」も exit システムコール を呼ぶのと同じです。 なので、実は違いがありません。 kill -KILL は、「『終了』を無条件に例外無く行う」と考えて下さい。
その他の回答 (5)
- a-kuma
- ベストアンサー率50% (1122/2211)
cherry_moon> #3 の補足になりますが、どんなシグナルがあるかは、 cherry_moon> signal.h、sys/signal.h を見れば分かります。 では、補足返しを :-) あれでは、OS によっては、すんごく重たくなるので > while(1){ > ; > } は、 pause(); としておいた方が良い、ということ。 もうひとつは、そのプログラムを動かしても SIGKILL だけは、my_handler() を 通らないことが、確認できますね、ということを付け加えておきます。
kill、kill -TERM、kill -15 といったコマンドは、 終了を表す「SIGTERM」というシグナルをプロセスに送ります。 プロセスがこのシグナルを受け取ると、ただ終了するのではなく、 プログラム内で指定された終了時の処理を行います。 (trapコマンドでこの処理は指定できます) たとえば、一時ファイルを削除したり、処理した項目をログに書き込むと行った処理が考えられます。 このシグナルを無視するようにも指定できます。 もしこれでプロセスを終了させられない場合、 kill -kill、kill -9 などのコマンドを利用することになります。 これらは、強制終了を表す「SIGKILL」というシグナルをプロセスに送ります。 この場合、naturalさんの書かれているように、プロセス自身の処理ではなく、 外部から強制的に終了させられるので、 終了時の処理などをプログラム内で指定できないのです。 (つまり、予想外の結果を招きかねません。) ちなみに、シグナルにはかなり種類があります。 bashなどでは、kill -l で確認できます。
- cherry_moon
- ベストアンサー率36% (37/102)
#3 の補足になりますが、どんなシグナルがあるかは、 signal.h、sys/signal.h を見れば分かります。 下のプログラムを実行すると、どんなシグナルが入力されてるか見れます。 #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> void my_handler(int sig); int main(int argc, char **argv) { int sig; for(sig=0;sig<256;sig++){ signal(sig, &my_handler); } while(1){ ; } return 0; } void my_handler(int sig) { printf("signal: %d\n", sig); return; }
- pythian
- ベストアンサー率32% (26/80)
終了とはプロセスに「終わってください」と言って、それに応答してプロセスが終わるものです。だから、プログラムが暴走したりして話を聞いてないときは無駄でしょう。Windowsで暴走したプログラムの×を押しても何も起こらないのと同じです。強制終了の場合、シグナルという信号を投げます。シグナルには数種類あるのですが、この場合プログラムに割り込んで処理を中断、終了させます。 Windowsの「・・・は応答していません。終了しますか?」のような画面に例えるとわかりやすいですね。ソフトウェアの動きに割り込んで強制終了させます。
- natural
- ベストアンサー率37% (419/1115)
プロセスの『終了』はプロセス自身の処理によって終了しますが、『強制終了』は外部からのシグナルによって強制終了命令を受け取ることによって終了させられるものです。 killコマンドには-9以外にもシグナルナンバーがあり、それぞれ送るシグナルによってプロセス側の反応も異なってきます。 killとはその名の通りプロセスを殺すことが代表的な役目ですが、実は様々なシグナルをプロセスに対して発行する役目を持っています。
お礼
ご回答ありがとうございました。