|
こんにちは、初めまして。 排他処理のことを読ませていただきまして、 フリーの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 にセットする 前に必要な変数を全て設定しておきましょう。 |
|
>\& は関数へのリファレンスです。ちなみに >・・・・・・ >関数へのリファレンスを使えば、どこで関数が定義されて >いようと動きます。 なるほど そういう違いなのですか。 >シグナルハンドラの場合も、%SIG にセットしてしまうとその後いつ >シグナルハンドラが呼ばれるかわからないので、%SIG にセットする >前に必要な変数を全て設定しておきましょう。 わかりました。 どうもありがとうございます。 |
|
http://messages.yahoo.co.jp/bbs?.mm=CP&action=m&board=1835092&tid=echoa4ka4da4a4a4f&sid=1835092&mid=4 > ↓には、「ping への応答」と書いてます。 > http://www.nspl.co.jp/Solaris/Security/inetd.html 誤りです。ping に応答するのは ICMP reply です。TCP/UDP の echo は、 http://ring.ocn.ad.jp/pub/doc/RFC/rfc862.txt を参照のこと。 A very useful debugging and measurement tool is an echo service. ってことですね。人様が直接使うものです。 …と yahoo BBS に書こうと思ったけどできなかったので、どなたか 伝えて下さい。 |
|
>>1868 68user > とりあえず pickup は使用不可としましたので、あしからず。 > 同時に実行するプロセス数を制限する機能を追加したら使用可能にします。 使用可能になりました。ちゃんと制限が効いてるかどうかは 試してませんが。 >>1878 68user > …と yahoo BBS に書こうと思ったけどできなかったので、 > どなたか伝えて下さい。 どもです>dio さん (ですよね?) |
|
>どもです>dio さん (ですよね?) あ、はい このページ参考にさせてもらったり、 お世話になったので。 |
|
ご存知であれば 教えてください psコマンド(ps -l)を実行したときの C 項目の数値の意味 なんですけどマイナス値のプロセスがあったのですが どのような状態を意味するのでしょうか? |
|
教えていただきたいことがあります。 UNIXについてはほとんど初心者なのですが、あるとき急に管理をしろ! と言われてしまいました。はじめはなんのトラブルもなかったのですが、 何日か前に急に他のマシンから自マシンへtelnet接続ができなくなって しまいました。 原因はなんなのでしょう? 機種は SUN ULTRA60 Solaris2.6が入ってます。もちろん自マシンにログイン後 自マシンの他のユーザへのtelnetでのログインもできないのです。 お願いします。 |
|
はじめまして、YOUKOと申します。 C-ISAMを使ってAPLを作成したいのですが 初めてで右も左もわかりません。 どこか初心者用のHPありませんか? OS:Solaris7です。 |
|
>>1881 akihiro > psコマンド(ps -l)を実行したときの C 項目の数値の意味 > なんですけどマイナス値のプロセスがあったのですが OS は何ですか? FreeBSD には C という項目はないように 思えます。Solaris2.6 では「スケジューリングのための プロセッサ利用率、ただし obsolete」と man に書いて あったような気がしますが、それ以上の事はわかりません。 >>1882 クワ > 何日か前に急に他のマシンから自マシンへtelnet接続が > できなくなってしまいました。もちろん自マシンにログイン後 > 自マシンの他のユーザへのtelnetでのログインもできないのです。 それは、問題のマシンで % telnet localhost でログインできないということですね? 全体的に情報が不足しています。「できない」とはどういう意味ですか? 何かエラーメッセージが出ますか? 何秒か待たされたりしますか? login: プロンプトは出ますか? 一般的には inetd が telnet ポートを見張り、接続があると inetd が telnetd を実行し、telnetd が認証を行います。もし % netstat -a | grep telnet tcp4 0 0 *.telnet *.* LISTEN という出力が出ないならば、telnet ポートを監視するサーバがいない ということなので、inetd の問題です。/etc/inetd.conf をチェック しましょう。 他にも tcpwrapper が接続を弾いている、などの可能性もありますが、 そこらへんは /var/log/ の下のログを見ましょう。telnet した後、 ls -lt /var/log すれば、最終更新時刻順にファイル一覧が表示 されますので、最も最近に更新されたログファイルの中を見れば 何かメッセージが書いてあるかもしれません。 >>1883 YOUKO > C-ISAMを使ってAPLを作成したいのですが C-ISAM という物を知らないのですが、Informix の DB 関係の ライブラリか何かでしょうか。そういうものは Informix の出して いるマニュアルを読むのが早道かと思います。 # 同様に、個人が提供している Oracle の情報も少ないですね。 |
|
>> 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をインストールしなおすとその方がおっしゃっておりました。 ご迷惑をおかけしました。 また分からないことがありましたらよろしくお願いします。 |
|
初めまして。 現在文字コードの変換について色々と模索中です。で、 このページの過去ログを見つけたのですが、情報を うまく理解することができなかったので質問させて ください。 まずバックグラウンドとして、Solaris2.6のWebサーバを 今まで他の人が管理してきたものの引継ぎで管理する事 になったのですが、そのWebサーバは文字の変換に /bin/iconvを利用しています。htmlファイルはeucJPで かかれていました。さらにソースの中でMETAタグに 「charset=x-euc-jp」という記述がありました。 またユーザからの情報をCGIからOracle(Solaris2.6上)に データを格納しています。この際CGIではeucからUTF-8に 変換を行なう記述がなされています。 # DBは個人的に触ることができない状態です。Solaris2.6 # の/bin/iconvを利用するところも変えられません。 通常インターネットを意識した時にはWindows環境(もち ろんこの中にも色々ありますが)だけを意識するのではなく、 色々な環境を意識してhtmlファイルを書くべきなのだと 思うのです(私見?)。 前置きが長くなりましたが質問です。 1.ソースの中でMETAタグに「charset=x-euc-jp」という 記述がある場合、ブラウザのエンコードで「自動認識」を 指定していれば、ソースは読める状態で表示され、かつ フォームに入力した文字列はeucJPでWebサーバに送信されて くるものだと信じているのですが正しいのでしょうか。 2.また正しい場合、表示を強引にSJISなどにしてフォーム に入力した場合にはeucJPで送られてくるのでしょうか。 それともSJISなのでしょうか。(まだ環境を自由にできない ので自分では確認できません。) 3.半角が入力されてきた場合にはどのように対処すれば いいのでしょうか。 4.JIS X 0208の13区、89〜92区、115区〜119区(換算)の 文字を入力するとエラーで返すようにしたいのですが、CGI でどのように記述すればいいのでしょうか。EUCコードで ADA1〜ADFE、F9A1〜F9FE、FAA1〜FAFE、FBA1〜FBFE、FCA1〜 FCFE(全て16進数) は不可、のように文字コードそのもので 制限をかけるのでしょうか。Perlでこういった内容を書き たいのですが、何か参考になるようなものがありましたら お知らせください。 長い文章になりましたが、ご助力お願いいたします。 |