68user's page 掲示板

Prev< No. 1885〜1890> Next  [最新発言に戻る] [過去ログ一覧]
No. 1885 # akihiro 2001/04/09 (月) 09:14:41
>> psコマンド(ps -l)を実行したときの C 項目の数値の意味
>> なんですけどマイナス値のプロセスがあったのですが
>OS は何ですか? ..(略)..、それ以上の事はわかりません。
HP-UNIXです。私なりに調査していますので解りましたら
載せさせていただきます。

No. 1886 # chie 2001/04/09 (月) 15:02:13
排他処理のページを見て質問なのですが、シグナル処理でCGIを終了
させたくない場合はどうすればよいのでしょうか?
シグナルを無視みたいなことはできないんでしょうかね??

よろしくお願いします。

No. 1887 # 68user 2001/04/09 (月) 18:59:22
>>1886 chie
> シグナルを無視みたいなことはできないんでしょうかね??
perl なら
    $SIG{QUIT} = 'IGNORE';
などとすれば無視できます。ただし、SIGKILL と SIGSTOP
だけは無視できません (ハンドラの設定も不可)。

No. 1888 # dio [E-mail] 2001/04/10 (火) 17:15:22
>ただし、SIGKILL と SIGSTOP
>だけは無視できません (ハンドラの設定も不可)。
横からすみませんが、無視できずハンドラの設定不可な
シグナルは、どのような意味があるのでしょうか?
(なぜ送られてくるのでしょうか?)

No. 1889 # 68user 2001/04/10 (火) 22:28:55
>>1888 dio
> 無視できずハンドラの設定不可なシグナルは、
> どのような意味があるのでしょうか?
シグナルをブロックしたプログラムが誤って無限ループしてしまったら
止める術がなくなります。

なので、プロセス側から制御できない SIGKILL や SIGSTOP という
シグナルを飛ばすことで、OS に強制的にプロセスを殺したり、動作を
止めたりするわけです。例をあげると、
    #!/usr/bin/perl
    $SIG{TERM} = sub { print "TERM!\n" }; # kill コマンド対策
    $SIG{INT} = sub { print "INT!\n" }; # Ctrl-C 対策
    while (1){
            printf("%d\n", $i++);
            sleep 1;
    }
というプログラムを実行すると、Ctrl-C や kill プロセス番号 で
終了させることはできません。しかし Ctrl-Z で動作を止めたり、
kill -9 (=kill -KILL) でプロセスを殺すことはできます。

# 実際は他にもシグナルはありますので、kill -HUP などで
# 殺すことが可能ですが、全てプログラム側でブロック可能です。

なお、SIGINT や SIGTERM を受けると、ファイルなどの後始末を
行ってから終了するプログラムは多いです。なので、いきなり
SIGKILL で強制終了させるのはおすすめできません。まず SIGTERM や
SIGINT を試して、それでも死ななければ SIGKILL を使うように
して下さい。

No. 1890 # dio [E-mail] 2001/04/11 (水) 14:45:02
えーと、私は何か勘違いをしていたかもしれません;

>なので、プロセス側から制御できない SIGKILL や SIGSTOP という
>シグナルを飛ばすことで、OS に強制的にプロセスを殺したり、動作を
>止めたりするわけです。
これはわかります。SIGKILL、SIGSTOPの必要性はわかるのですが、
プロセスから制御できない物をなぜシグナルとして送る
必要があるのだろうかと思ったのです。
私はOSがプロセスにSIGKILL や SIGSTOPをとりあえず送って、
強制終了させる物と思っていたのですが、この考えが方が間違いでしょうか?

Prev< No. 1885〜1890> Next  [最新発言に戻る] [過去ログ一覧]