|
こんにちは、初めまして。 排他処理のことを読ませていただきまして、 フリーのCGIスクリプトに自分でシグナルに関する部分を追加しようと思いました。 ここでは $SIG{PIPE} = \&lock_off; というようにしておられますが、他のところでは、 $SIG{'PIPE'} = 'lock_off'; といった感じに書いていました。 これらは同じ意味なのでしょうか?(\&というのがよくわかりません) それから、こういったハンドラの定義は、ソース中のどの位置に書いても 同じなのでしょうか。最初の方に書いた方がいいのでしょうか? そして、ハンドラの中で変数の値を参照する場合、 その変数の初期化前にそのハンドラを書いて問題ないでしょうか? sub lock_off { if ($lockkey) { &unlock; } exit; } ・・・ $lockkey = 1; といった感じで。 Perlはまだよくわかっていないので、常識なことなのかもしれないですが、 よろしくご教授お願いします。 |
|
はじめまして。 CGIで環境変数を取得していると、「(compatible; MSIE 5.5; 〜〜」等で表示されるはずが、「好きな名前〜〜〜」でアクセスす人がまれにいるのです。これはどううことなのでしょうか? |
|
>CGIで環境変数を取得していると、「(compatible; MSIE 5.5; 〜〜」 >等で表示されるはずが、「好きな名前〜〜〜」でアクセスす人がまれにい >るのです。これはどううことなのでしょうか? クライアント(ブラウザ)がサーバに送るUser Agent 文字列を自由に設定できるソフトを使っているからではないでしょうか。 私の使っているフリーのタブブラウザ、「DonutR」でも、UserAgentを 自由に設定できます。 |
|
>>1873 dio > $SIG{PIPE} = \&lock_off; \& は関数へのリファレンスです。ちなみに $SIG{PIPE} = sub { unlink($lock_file); exit; } と等価です。 > $SIG{'PIPE'} = 'lock_off'; これだと、シグナルハンドラ lock_off の関数定義が同一ファイル 内にないといけません。別ファイルに sub lock_off を書いて、 それを require している場合は動かないということです。 関数へのリファレンスを使えば、どこで関数が定義されて いようと動きます。 これらの事柄はラクダ本に書いてありますので、もちお持ちで ないなら、購入されることをお薦めします。 > ハンドラの中で変数の値を参照する場合、その変数の初期化前に > そのハンドラを書いて問題ないでしょうか? これは、ハンドラ特有の問題ではなく、関数一般の話になります。 #!/usr/bin/perl &lock_off; sub lock_off { print $lockkey } $lockkey = 1; exit; と #!/usr/bin/perl $lockkey = 1; &lock_off; sub lock_off { print $lockkey } exit; では、前者はよろしくないことはわかりますね。 シグナルハンドラの場合も、%SIG にセットしてしまうとその後いつ シグナルハンドラが呼ばれるかわからないので、%SIG にセットする 前に必要な変数を全て設定しておきましょう。 |