|
>> psコマンド(ps -l)を実行したときの C 項目の数値の意味 >> なんですけどマイナス値のプロセスがあったのですが >OS は何ですか? ..(略)..、それ以上の事はわかりません。 HP-UNIXです。私なりに調査していますので解りましたら 載せさせていただきます。 |
|
排他処理のページを見て質問なのですが、シグナル処理でCGIを終了 させたくない場合はどうすればよいのでしょうか? シグナルを無視みたいなことはできないんでしょうかね?? よろしくお願いします。 |
|
>>1886 chie > シグナルを無視みたいなことはできないんでしょうかね?? perl なら $SIG{QUIT} = 'IGNORE'; などとすれば無視できます。ただし、SIGKILL と SIGSTOP だけは無視できません (ハンドラの設定も不可)。 |
|
>ただし、SIGKILL と SIGSTOP >だけは無視できません (ハンドラの設定も不可)。 横からすみませんが、無視できずハンドラの設定不可な シグナルは、どのような意味があるのでしょうか? (なぜ送られてくるのでしょうか?) |
|
>>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 を使うように して下さい。 |
|
えーと、私は何か勘違いをしていたかもしれません; >なので、プロセス側から制御できない SIGKILL や SIGSTOP という >シグナルを飛ばすことで、OS に強制的にプロセスを殺したり、動作を >止めたりするわけです。 これはわかります。SIGKILL、SIGSTOPの必要性はわかるのですが、 プロセスから制御できない物をなぜシグナルとして送る 必要があるのだろうかと思ったのです。 私はOSがプロセスにSIGKILL や SIGSTOPをとりあえず送って、 強制終了させる物と思っていたのですが、この考えが方が間違いでしょうか? |
|
>>1890 dio ん〜、SIGKILL, SIGSTOP の必要性はわかるが、ブロックできないんだから 「シグナル」として扱うのは変ではないか。SIGKILL, SIGSTOP と同等の 機能を持たせたシステムコールを新設した方がよいのではないか、という ことでしょうか? じゃなくて、OS が SIGKILL や SIGSTOP を送るのはわかるが、 コマンドラインで kill コマンドを使って SIGKILL, SIGSTOP を 送れるのは変ではないか、ということですか? |
|
前者のほうにちかいです プロセスを殺すのはOSなのですよね? プロセスにSIGKILLやSIGSTOPが送られても プロセスはそれに対して何も出来ないのなら、 なぜ送られてくるのかな?と。 プロセスはSIGKILLやSIGSTOPを認識出来ないのではないのですか? |
|
>>1892 dio > プロセスはSIGKILLやSIGSTOPを認識出来ないのではないのですか? できないです。 OS はプロセスごとにシグナルのテーブルを保持しています。例えば SIGTERM を無視する場合はテーブルの SIGTERM の項目を 1 に、 シグナルハンドラをセットする場合は、SIGTERM の項目にシグナル ハンドラ (関数) のアドレスをセットする、というふうに。 で、シグナルが飛んできたら、OS は対象のプロセスのテーブルを 参照し、無視すべきか、ハンドラを実行すべきかなどを決めます。 しかし SIGKILL/SIGSTOP は、 - テーブルの書き換えができない - シグナル発生時に OS がテーブルを参照することなくプロセスを操作する のどちらかの理由のため (どっちが本当かは知りません)、プロセス からブロックすることはできません。 だから、実際に OS が何かをプロセスに送っているわけではありません。 …で、回答になりましたか? ちなみにシグナルは FreeBSD なら ここらへんで処理してます。 http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/sys/kern/kern_sig.c?rev=1.115 |
|
>で、シグナルが飛んできたら、OS は対象のプロセスのテーブルを >参照し、無視すべきか、ハンドラを実行すべきかなどを決めます。 なるほど、シグナルを受け取るのはOSなんですか。 >だから、実際に OS が何かをプロセスに送っているわけではありません。 そうでしたか。 私の考え方がWindows的でした。 (WindowsのMessageのような物と考えてました;) >…で、回答になりましたか? はい、どうもありがとうございました。 |
|
>>1884 68user >それは、問題のマシンで > % telnet localhost >でログインできないということですね? お返事が遅くなってしまいました。すみません。 上記のように入力すると、 SunOS5.6 ....(省略)普通といっしょ。 connection closed by foreign host. といわれます。 UNIXの相当詳しい人に見てもらったのですが、ぜんぜんおかしい 部分がないとのことでした。 来週OSをインストールしなおすとその方がおっしゃっておりました。 ご迷惑をおかけしました。 また分からないことがありましたらよろしくお願いします。 |