No.3ベストアンサー
- 回答日時:
いわゆる unix には、「シグナル」というイベント通知の仕組みがあります。
あるプロセスに対して、シグナルが送信されると、そのプロセスは、やっている
処理を中断して、シグナルハンドラという特別に割り当てられた処理を行います。
kill コマンドというのは、このシグナルの送信をするコマンドに他なりません。
シグナルは、番号でイベントを区別でき、何種類もあり、それぞれの番号毎に
意味が割り当てられています。
シグナルハンドラは、自分で作って登録することもできますが、その登録を行わない
ときには、それぞれのシグナルに「デフォルトの動作」が割り当てられています。
デフォルトの動作は、無視・コア・終了・停止の4種類あります。
シグナルの中で9(SIGKILL)だけは、ちょっと特別で、シグナルハンドラの登録が
無視されます。なので、このシグナルを送信することで、対象のプロセスを無条件に
終了させることが保証されています。
これを簡単に言うと「強制終了」ですね。
他にも、デフォルトの動作が「終了」シグナルがあります(例えば、1や2)。
こいつらも送信すると対象のプロセスは終了するのですが、シグナルハンドラを
登録することができるので、そのプロセスの作り方によっては終了しないことが
ありえます。
> そもそもプロセスの『終了』と『強制終了』の違いとは何ですか?
普通にプロセスが終了する場合、というのは exit システムコールを呼んだのと
同じなんですが、シグナルのデフォルトの動作での「終了」も exit システムコール
を呼ぶのと同じです。
なので、実は違いがありません。
kill -KILL は、「『終了』を無条件に例外無く行う」と考えて下さい。
No.6
- 回答日時:
cherry_moon> #3 の補足になりますが、どんなシグナルがあるかは、
cherry_moon> signal.h、sys/signal.h を見れば分かります。
では、補足返しを :-)
あれでは、OS によっては、すんごく重たくなるので
> while(1){
> ;
> }
は、
pause();
としておいた方が良い、ということ。
もうひとつは、そのプログラムを動かしても SIGKILL だけは、my_handler() を
通らないことが、確認できますね、ということを付け加えておきます。
No.5
- 回答日時:
kill、kill -TERM、kill -15 といったコマンドは、
終了を表す「SIGTERM」というシグナルをプロセスに送ります。
プロセスがこのシグナルを受け取ると、ただ終了するのではなく、
プログラム内で指定された終了時の処理を行います。
(trapコマンドでこの処理は指定できます)
たとえば、一時ファイルを削除したり、処理した項目をログに書き込むと行った処理が考えられます。
このシグナルを無視するようにも指定できます。
もしこれでプロセスを終了させられない場合、
kill -kill、kill -9 などのコマンドを利用することになります。
これらは、強制終了を表す「SIGKILL」というシグナルをプロセスに送ります。
この場合、naturalさんの書かれているように、プロセス自身の処理ではなく、
外部から強制的に終了させられるので、
終了時の処理などをプログラム内で指定できないのです。
(つまり、予想外の結果を招きかねません。)
ちなみに、シグナルにはかなり種類があります。
bashなどでは、kill -l で確認できます。
No.4
- 回答日時:
#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;
}
No.2
- 回答日時:
終了とはプロセスに「終わってください」と言って、それに応答してプロセスが終わるものです。
だから、プログラムが暴走したりして話を聞いてないときは無駄でしょう。Windowsで暴走したプログラムの×を押しても何も起こらないのと同じです。強制終了の場合、シグナルという信号を投げます。シグナルには数種類あるのですが、この場合プログラムに割り込んで処理を中断、終了させます。Windowsの「・・・は応答していません。終了しますか?」のような画面に例えるとわかりやすいですね。ソフトウェアの動きに割り込んで強制終了させます。
No.1
- 回答日時:
プロセスの『終了』はプロセス自身の処理によって終了しますが、『強制終了』は外部からのシグナルによって強制終了命令を受け取ることによって終了させられるものです。
killコマンドには-9以外にもシグナルナンバーがあり、それぞれ送るシグナルによってプロセス側の反応も異なってきます。
killとはその名の通りプロセスを殺すことが代表的な役目ですが、実は様々なシグナルをプロセスに対して発行する役目を持っています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TOPコマンドで表示するCPU使用...
-
プロセス、サービス、デーモン...
-
プロンプトが返らない
-
タスクマネージャのCPU率がおか...
-
Windowsで作れるスレッド最大数...
-
インターネットエクスプローラ...
-
タスクバーの音量アイコンをク...
-
CPU率が低いのにLoad Averageが...
-
強制終了できないプロセスの強...
-
systemのCPU使用量が一瞬極端に...
-
子孫プロセスを全て終了
-
CPUが100%になってしまう。
-
System Idle Processってなに?...
-
タクスが複数現れる。
-
ps コマンドのステータス。S Ss...
-
sighupとsigtermの違い
-
HP-UXでのプロセス別メモリ使用...
-
アクティビティモニタの(OS10.3.4)
-
プログラムを一時停止→再起動→...
-
CLI exe って??
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TOPコマンドで表示するCPU使用...
-
プロセス、サービス、デーモン...
-
System Idle Processってなに?...
-
タスクマネージャのCPU率がおか...
-
プロンプトが返らない
-
コマンドライン上でファイルを...
-
Windowsで同時にオープンできる...
-
Windowsで作れるスレッド最大数...
-
プロセスがタスクマネージャー...
-
タスクバーの音量アイコンをク...
-
デーモンモードとは何でしょうか?
-
【プログラム】 iu14d2n.tmp ...
-
CPU使用率取得方法について
-
強制終了できないプロセスの強...
-
CPU使用率が常に50~10...
-
アクロバットを終了しても、プ...
-
プロセスの終了について教えて...
-
httpdの子プロセスがゾンビ化す...
-
ps コマンドのステータス。S Ss...
-
イラストレータでの透明部分の...
おすすめ情報