68user's page 掲示板

Prev< No. 268〜270> Next  [最新発言に戻る] [過去ログ一覧]
No. 268 # M.Masuda 1999/04/15 (木) 15:31
>/sbin/ping もsuidされてるので
本当ですね。今まで気づかず使っていたみたいです...
#mount等がそうなのは分かりますが。ICMPをしゃべる事自体
#root権限が必要なのだろうか?無駄なトラフィックを避ける為?

> alarmのシグナルハンドラからの復帰先を指定したいとか?
はい、まったくそのとおりです。
#やっぱ表現力足りないみたい>自分
gotoは68Userさんと同じ理由で使うつもりは有りません。

ラクダ本でのalarmの解説が、私にとっては不十分なので上記の
方法があるのかさえ分かりません。
#シェルスクリプトでも同様の方法があるのでしょうか?

またこういう処理をする時に定石の様なものは有りますでしょうか。
あれば簡単でも教えてもらえれば助かります。

No. 269 # 68user 1999/04/16 (金) 03:05
> またこういう処理をする時に定石の様なものは有りますでしょうか。
定石かどうかはわかりませんが、
    sub alarm_handler {
        # ここに処理がきたということは、2秒以内にpingが終了しなかったということ
        # なので子プロセスを殺す。
        kill 1,$child_pid;
        $flg = 0;
    }
    $SIG{ALRM}=\&alarm_handler;
    $flg = 1;
    if ( $child_pid = fork ){ # 親
        alarm 2; # 2秒後にalarmセット
        wait;  # 子プロセスの終了を待つ
        alarm 0; # 2秒以内に終ったら、alarm解除
    } else {  # 子
        exec "ping -c 1 host";
    }
    if ( $flg == 1 ){ ping成功 }

とか。本来はもっと賢い方法があるのかもしれませんね。
子プロセスの始末まで考えなくていいなら、
    sub alarm_handler { $flg = 0; }
    $flg = 1;
    if ( fork ){
        alarm 2; sleep 4;
    } else {
        exec "ping -c 1 host";
    }
    if ( $flg == 1 ){ ping成功 }
でもいいかも。

No. 270 # M.Masuda 1999/04/16 (金) 15:31
サンプルまで書いてもらってありがとうございます。
自分で書いたスクリプトも、ほとんど同じような事をして、
さらに引数で秒数を指定できる様にしてあります。
#もっともこんなスマートには書いてないですが(^^;

>子プロセスの始末まで考えなくていいなら、
自分のスクリプトではこの部分の処理まではしていません。
試験時にスクリプト実行後(シェル、web経由)にpsで確認しても
プロセスが残る事はなかったので。
シェルやアパッチがこの辺の処理はやってくれると思っています。
#そう思いたいってのが本音。

スマートなスクリプトの為の勉強になりました。
いつもありがとうございます。

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