> もし単にパスが違うだけならやりようはあります。 > もしそうなら再度質問して下さい。 すみません、おっしゃる通です Windowsが #!C:/Perl/bin/perl で UNIXが #!/usr/local/bin/perl です どうにかなるでしょうか? |
よしださん Win機の 1.Apacheをインストールしたのと同じドライブに 2.\usr\local\bin\を掘って 3.Perl一式(Perl.exeとDLL類)を入れれば #!/usr/local/bin/perlで参照できると思います. お試しください. |
UNIX,CGI,ネットワークについての事ではないので、この掲示板の趣旨に合わない かも知れませんが、下記の事についてどなたか知っていましたらお教え下さい。 実はMOについてですが、これまで認識していたメディアが急に認識されな くなり、他のメディアで試しても同じ現象が出るようになりました。 クリーニングしても直りません。たまに認識する事もあり、なにがおかしい のか見当もつかず、途方に暮れています。 何か方法があるでしょうか。 |
YOSHIさん 次のようなページをご紹介します. MO掲示板: http://www.zob.ne.jp/%7Ekanai/mo/bbs/bbs.pl MOにこだわるページ: http://www.zob.ne.jp/~kanai/mo/ MOS331E 遍歴: http://www1.sphere.ne.jp/squilla/comp/mos331al.html 悪名高いオリンパスドライブの清掃方法です. # 私もジャンクの331(Logitec LMO-230H)を手に入れ, # 清掃して問題なく使っています. 参考まで. |
現在、さくらインターネット<http://www.sakura.ad.jp>で専用サーバを借りています。OSはFreeBSD 3.4です。大した知識もないのに大丈夫かな、と思っていたところ、ついに困った事態になりました。 chsh -s でログインシェルを変更したのですが、誤った名前を指定してしまったのです。それからというもの、スーパーユーザになろうとしても su: +++: No such file or directory と出てしまい、rootによる作業が一切できない状況です。 root権限で chsh -s /bin/sh でも実行できれば済むのですが、どうすればいいものやら。セキュリティホールを利用できないか、などと本気で考えましたが、そんな技量もありませんでした。 きちんと業者に頼むべきなのでしょうが、Telnetでできる作業は1万円、Telnetでできない作業は2万円と、勉強料としても学生にはかなり惜しくなる出費なのです。 何かいい方法があるなら教えていただけないでしょうか。 |
> su: +++: No such file or directory むぅ…多分無理だと思います。一旦 shutdown して シングルユーザモードで再起動するしかないので 2万円コースだと思います。 あきらめきれなければ、 http://www.energy.ee.ehime-u.ac.jp/~flathill/FreeBSD/chat/chat.html で聞いてみて下さい。そこの方々が無理だと言ったら絶対無理です。 あと、回答してもらっても返答する気がないなら、最初から 書き込まないで下さい>返答する気のない人々 |
またまたperlについてお聞きします。 連想配列をうまく使って、キーに対して文字列リストを 保持したいと思うのですが、何かよい方法はありますでしょうか。 現在は、文字列を共通のリスト配列に順に格納して、 キーに対する文字列リストの中の最初の文字列へのインデックスを 連想配列に格納する、という方法をとっています。 うまく伝わらないかもしれませんので、少々サンプルを書きます。 $store = 0; foreach $file (@files) { open(IN, $file); @contents = <IN>; $index{$file} = $store; $numlines{$file} = $#contents + 1; @lines[$store..$store+$#contents] = @contents; $store += $#contents + 1; } |
要は、ファイル名と行番号を与えると、その行が得られるデータ 構造は?、ということでいいですか? なら、 while (<IN>){ $data{$file}{$line}=$_; $line++; } とやってもいいし (perl4 的にするなら $data{"$file$line"})、 あるいは @contents=<IN>; $index{$file}=\@contents; と、配列へのリファレンスをハッシュに入れてもいいと思います。 参照するときは $file = 'abc.txt'; $line = 123; print ${$index{$file}}[$line]; とか (abc.txt の 123行目を表示。先頭が0行目)。 |
Netboyさんありがとうございました > #!/usr/local/bin/perlで参照できると思います. > お試しください. 試してみたんですが、 #!E:/usr/local/bin/perl だと動くんですが、 #!/usr/local/bin/perl だと駄目なので どうもapachの自己完結型がドライブ名の指定が必要みたいでした、 結果は残念でしたけど、どうもありがとうございました。 >あと、回答してもらっても返答する気がないなら、最初から > 書き込まないで下さい>返答する気のない人々 すみません、原因が解ったら書き込もうと思っていたので 返答が遅くなってしまいました 以後気をつけます。 |
よしださん 次のようなショートカットからApacheを実行してみてください. '作業フォルダ'のパスにあるドライブ名が,Perlの参照先ドライブになります. 動作を確認後にオプションを追加して,サービスとして実行させてください. リンク先: e:\usr\local\sbin\apache\Apache.exe -f e:\usr\local\etc\apache\conf\httpd.conf -s 作業フォルダ: e:\usr\local\sbin\apache # 2つとも,Apache.exeがe:\usr\local\sbin\apacheにあるとき - - - - - - - - - - - - - - - 参考になるURLをご紹介します: NTでIISやApacheのPerlの参照の設定: http://www.hi-ho.ne.jp/lina/httpd.html#apache-pl Apacheのレジストリ操作,NTサービスとしての実行など: http://www.apache.org/docs/windows.html |
Netboyさん ありがとうございます ApachとPERLのドライブを合わせる必要があったんですね、 おかげさまで思いどおりの動作をしてくれるようになりました 本当に色々とありがとうございました。 |
@68user どうもありがとうございました。 リファレンスというのを勉強しときます。 それと、こちらに来られるかもということですが、 予定を確認しておきます。 |
@よしださん > すみません、原因が解ったら書き込もうと思っていたので > 返答が遅くなってしまいました 別に1週間くらいはいいと思いますよ。「わかりました。試してみます」 と書くより、試してから結果を書こう、というタイプの人もいるでしょうから。 それ以前の人に向けていったことなので、気になさらないで下さい。 > もし単にパスが違うだけならやりようは > あります。もしそうなら再度質問して下さい。 cygwin 入れて #!/bin/sh で振り分け、とか言わなくてよかった (笑) @has > リファレンスというのを勉強しときます。 赤ラクダ本には載ってません (念のため)。でもって、青ラクダ本の 説明はわかりにくいです。ちなみに $hoge{fuga}{ura} ってのも 実はリファレンスです。 > 予定を確認しておきます。 いや、いつ行くかも未定なので、いつも通りに過ごしてて下さい。 雨降ったら行けないし :-) |
>あと、回答してもらっても返答する気がないなら、最初から >書き込まないで下さい>返答する気のない人々 ・・・すみません。 以前、telnetで30個ほど繋げたら、フリーズしてしまったので、 perlで繋げる方法を考えつつ、先に進んでいないのと、まだ、 bugの原因が不明(というか、お手上げに近い)ので、返事できない 状態でした。 返答が遅れてすみません。 |
へにかさんに向けて言ったのでもありません :-) |
ご無沙汰しております、以前にお世話になったyujiです。(^^) 現在、FreeBSD 2.2.8-RELEASEのカーネルなどをPentium3に最適化させたいと 考えているのですが、この場合、どういった部分を変更すべき なのでしょうか? 自分で調べてみたところ、 http://www.goof.com/pcg/index.html に、Pentium用パッチ(pgcc)があるのですが、 gccが現在2.7.2.1でして。(^^; portsコレクションを探してみたのですが、 pgcc2.95.1のものがあるみたいですが、 プルダウンメニューが3.0以上のみになっています。 PGCCは、EGCSのパッチということで、 2.7.2.1のような古いバージョンには、 使えないのかもしれませんが。(^^; FreeBSD 2.2.8-RELEASEを用いて、 マシンの能力を最大限に引き出す方法はなにかありませんでしょうか? どうぞよろしくお願いします。 |
お返事ありがとうございました。 >> su: +++: No such file or directory >むぅ…多分無理だと思います。一旦 shutdown して >シングルユーザモードで再起動するしかないので >2万円コースだと思います。 管理会社に連絡したところ、今回のように原因がはっきりしていて復旧が容易な場合は1万円だそうです。まあ仕方がないと思います。これからはもっと慎重に作業をしなければ……。 |
携帯電話に対してこちらの電話番号を表示しないためにはどうすればいいですか? |
perlでのサブルーチンの質問です。 お願いします。 #!/usr/local/bin/perl $Z = 1; &abc(); print "$Z$Y"; sub abc{ &A(); &B(); &C(); } sub A{ if($Z == 1){ $Z = $Z + 1; &C(); } } sub B{ $Z = $Z + 5 ; } sub C{ $Y = "!"; } こんなカンジなのですが結果を"2!"になるようにしたいのですが どうすればよろしいでしょうか? このまま実行すると"7!"になってしまいます。 教えてください。 |
@yujiさん > 現在、FreeBSD 2.2.8-RELEASEのカーネルなどをPentium3に最適化させたいと > 考えているのですが すみませんが、http://www.jp.FreeBSD.org/search.html#doc で キーワード pgcc で検索する、以上の情報はわかりません。 cvsweb で ports/lang/pgcc を見ると、2.2.8 時代は (pgcc 側の) gcc->egcs の切り替え時期なようで、その時代の gcc 対応 pgcc は ないと思います。最新の egcs を入れて pgcc パッチを当てるのは ダメかなぁ。いろんなところではまりそうですけど。 # あ、最近のは a.out 形式吐けないんだっけ。 @STさん > これからはもっと慎重に作業をしなければ……。 telnet 2つ開いて、片方はつなぎっぱなしにして いつでも /etc/master.passwd を修正できるようにしておくとよかったですね。 @mmさん # biglobe な mm さんとは別の mm さんですか? > 結果を"2!"になるようにしたいのですがどうすればよろしいでしょうか? sub B{ $Z = $Z + 5 ; } の部分で $Z==7 になってほしい、でも &B から戻ると $Z==2 としたい、 ということなら、呼び出し側で &B($Z) として引数を渡して sub B{ my ($abc)=@_; $abc = $abc + 5 ; } とか ($abc は $Z としても同じ)、単順に変数名を変えて sub B{ $X = $Z + 5 ; } とか、って感じでいいですか。 望んでる答えじゃないかもしれないけど、なぜ 2! にしたいのか、 &A と &B ではどういう違いがあるのかを説明してもらわないと、 これ以上はなんとも言えません。 |
私にも意味が分からないので、別人かと思われます。 ひょっとして、sub A {...} 中で &C(); を呼び出したら、 sub abc{...} 中の &C(); に帰って来る、と誤解されてるとか…? # goto &NAME に関係あるのかとも思ったけど… |
># biglobe な mm さんとは別の mm さんですか? mm@biglobeさん、失礼しました。 説明不足ですみませんでした。 sub A の処理で $Z == 1 の場合sub C へ行きたいのです。 その後、sub B へは行かずに処理を終了させたいのですが、、、 |
もしかして #!/usr/local/bin/perl $Z=1;&abc;print "$Z$Y"; sub abc{ if (!&A){ &B; } &C; } sub A{ if ($Z==1){ $Z++;return 1; } 0; } sub B{ $Z+=5; } sub C{ $Y="!"; } な感じですか...? 文章のままだと sub abc{ if (!&A){ &B;&C; }} sub A{ if ($Z==1){ $Z++;&C;return 1; } 0; } な感じです.関数の戻り値を使わないなら sub abc{ &A; if ($Z!=2){ &B; } &C; } sub A{ if ($Z==1){ $Z++; }} 延々と続きそうですね.こんな話題じゃ無さそうな気も... |
あれ?mmさんの反応がないなぁ… Netboyさんの回答で、出尽くしてると思うんだけど。 |
そーいや、名前に機種依存文字を入れると、何かが起こったっけ。 多分まだ なおしてなかったなぁ。 # 現在機種依存文字が見えない環境なので、勘で入力。 |
そうか、名前の欄が <INPUT ... VALUE="<FONT COLOR="red">(6)(8)</FONT>user"> となってしまうんだった。今度直そう。 ところで、LASER5 Linux 6.0 でも /etc/services は pop-3 でした。 |
@68user 名前に機種依存文字入れたときの不具合、 直ったら修正部分をおしえてください。 #うちのにも同じ不具合があるってことですよね? |
了解。でも、ちと忙しい日が続きそうなので9月頃になるかも…。 |
こんばんわ。ちょっとお聞きしたいことがありまして。。。 うちの掲示板はmmさん(ここにいる人かどうかはわかりませんが)が作った掲示板を使っているんですが、 crypt関数が使えなくて削除パスとかが出てこないんです。それで、サーバ管理者に連絡しましたら、 >弊社サーバーでも、crypt関数はもちろんご利用頂けます。 >ただし、サーバーの暗号処理にMD5方式を搭載しておりますので >MD5以外のサルト係数を使用したスクリプトでは、そのままでは動作致しません。 >(cryptはサーバーのライブラリに依存している為) >cryptをMD5方式のサーバーでお使いになるには、salt係数をMD5の >$1$ 固定で指定する必要がありますので、スクリプト内の >該当部分を書き換えてご利用ください。 と教えていただきました。でもどこをどう直せばいいのかさっぱりなんです。 忙しいと言っていますけどもし時間が空きましたら、教えていただけますでしょうか。お願いします。 ちなみにhttp://whitenight.org/etc/bbs/Readme/crypt.cgiにcryptを実行するCGIがあります。 ソースはhttp://whitenight.org/etc/bbs/Readme/crypt.txtにありますんで、どうかみてやってください。 長文すいませんでした。 |
あっ、crypt.cgi はMD5には対応してないですね(^^; MD5を使える環境にないので、詳しくは、68userさんのご助言を頂きたいのですが、 とりあえず、ソースの以下の行を削除して、 if ( $salt !~ m%^[\./0-9A-Z]{2}$%i ) { print "<H2>エラー</H2>\n"; print "SALTが不正です\n"; exit(0); } SALTの入力欄の2文字の前に「$1$」を挿入して実行してみて頂けます? |
まず OS 名は何ですか? >>(cryptはサーバーのライブラリに依存している為) 僕の知る限りでは (少なくとも FreeBSD では) 誤りです。 なんにも考えずに salt を渡せば、ライブラリ (libcrypt) の 方で DES でも MD5 でも勝手に処理してくれます。 # ただ、FreeBSD 以外の環境 (例えば Linux で MD5 な環境) だと、 # ライブラリがそこまで対応しているかどうかはよくわからんなぁ。 # 明日試してみよう。 しかし、http://whitenight.org/etc/bbs/Readme/crypt.cgi の 結果が $PassWord = ''; と空になるのは謎ですね。 > print crypt( $pwd, $salt ); これを print crypt( $pwd, "\$1\$$salt\$" ); とするとどうですか。あるいは print crypt('secret','ab'); だとどうなりますか。 |
おっと少々かぶりぎみ。 crypt.cgi は FreeBSD (MD5) 上ではうまく動きました。FreeBSD の libcrypt では crypt('secret','xx') と crypt('secret','$1$xx$hogehoge') は同じものとして扱われるからです。 ということは、智慧さんの環境ではそうではないということで しょうから、$1$..$ を追加すればいけるんじゃないかと思います。 |
あっ、なるほど。(最後の $ も忘れてた) 68user さんの指示に従って対処して下さい>智慧さん |
>mm@biglobeさん >68userさん あ、ごめんなさい。 こんなに早くお返事してもらえるとは思ってもいませんで・・・。 じゃ今から早速やってみます。 レスありがとうございました。 |
あ、順々にやらせてもらったんですが、もう最初のmm@biglobeさんの言ったとおりに、 一部分削除して、 >$1$ これを前に入れて5文字で実行したらちゃんと生成されました! >まず OS 名は何ですか? あとこれは結局わからないです・・・(汗) お手間を取らせまして・・・。ほんとどうもありがとうございました。 |
ラウンジでは、いつもお世話になっていました。ありがとうございました。 ラウンジで質問ができないので、こちらへ質問させてもらいます。 UNIXにおいてflockを使用するデメリットを教えて下さい。 また、flock使用のCGIを見つけるコマンドなど存在しますか? 自サイトでCGIをフリー配布していますが、使っている人から、プロバイダでflockは、やめてくださいと通知されたそうです。 よろしくおねがいいたします。 |
ついでに、もうひとつ。 私の vi では、テキストファイルに一行 1024バイト以上の行があるとき 途中で切れて、全部見れません。 このような場合、「編集できない」と「多少のデータ欠落」はOKですが、 とにかく、全体を見れて、検索できるような、コマンドってないですか? |
LASER5 Linux (標準で MD5) では、 crypt('secret','$1$xx$') -> $1$xx$r/r0qx2Q7FpBQWOTZk2Nc. (MD5) crypt('secret",'xx') -> xxWAum7tHdIUw (DES) となりました。こういう環境があるとは知らなかった。 > UNIXにおいてflockを使用するデメリットを教えて下さい。 NFS 環境下で flock が動作しないそうですが、僕のまわりでは NFS 環境でも正常にロックできていたように見えました。 それ以外はわかりません。プロバイダが「使うな」と言うほどの デメリットはないように思います。 > また、flock使用のCGIを見つけるコマンドなど存在しますか? これは質問の意図がわかりません。 > 私の vi では、テキストファイルに一行 1024バイト以上の行があるとき > 途中で切れて、全部見れません。 nvi という vi ファミリのエディタでは、その手の制限はなかった ように思います。ちなみに FreeBSD の vi は nvi だったりします。 > とにかく、全体を見れて、検索できるような、コマンドってないですか? nvi 以外だと less かなぁ。less で 1024バイト/行なファイルを 見られるかどうかは確かめてませんが。まぁ、fold してその出力を 眺めるっつーのもアリかもしれません。 |
大学では、UNIXを使っているので、いつもこのHPにはお世話になっております。 それで、質問があるのですが。 UNIXでは、Windowsなどから送られてくる添付ファイルを 受けとる事はできますか? また、添付ファイルを送る事はできますか? よろしければ、そのやりかたも教えて頂けると嬉しいです。 ちなみに、使用機種は、SunOS 5.6です。 |
>68userさんへ foldコマンドでいけました! ありがとうございました。 >>また、flock使用のCGIを見つけるコマンドなど存在しますか? >これは質問の意図がわかりません。 ただ、プロバイダがどうやってflock使用のプロセスを見つけたのかなぁっておもったもので...。 では、これで、失礼いたします...。 |
> プロバイダがどうやってflock使用のプロセスを > 見つけたのかなぁっておもったもので...。 grep? > UNIXでは、Windowsなどから送られてくる添付ファイルを > 受けとる事はできますか? また、添付ファイルを送る事はできますか? メーラー次第です。Mew や Wanderlust あたりなら できますが、emacs の rmail とか mail コマンドでは 難しい…というか多分無理でしょう。 # Mew ... http://www.mew.org/index-j.html # Wanderlust ... http://www.gohome.org/wl/index.ja.html |
NFS上のファイルをflockすると,複数マシンから 同時にロックできてしまう(場合がある)と思いますが... Perlで普通にflockを使っていると,たいがい まともにロックできないうえ処理速度が遅くなります. open (LOCK, "> $file")||&error flock (LOCK,2)||&error とか書いた時点で終わってます.2箇所直せば使えますけど 普通そんなこと気付きません. あと,デッドロックの発生を検知するのが難しいです. |
68userさん> 御回答ありがとうございました。 僕のメーラーはemacsのrmailなので、受けとれないみたいですね。 文章の添付ファイルならば、その文章は一応表示されますが。 それで、御紹介頂いた Mew と Wanderlust のHPに行ってみたのですが、 その2つの違いというものがよく解りません。 よろしければ教えて頂けますか。 用途は、添付ファイルを受けとるだけなので、それに適しているのは どちらなのかというのも教えて頂けると嬉しいです。 あと、もう一つ質問なのですが、 あるファイルのシンボリックリンクを作った時に、 そのシンボリックリンクの元となるファイルから、 そのファイルのシンボリックリンクがどこに作られているかを 見つけ出す事はできますか? なんか解りにくい文章ですみません。 |
> それで、御紹介頂いた Mew と Wanderlust のHPに行ってみたのですが、 > その2つの違いというものがよく解りません。 両方ともメーラーなわけで、できることは自然と似てきます。 一応僕の思う特徴をあげると Wanderlust のいいところ ・見栄えがきれい (スクリーンショット参照) ・IMAP4 対応 ・ニュースリーダの機能もある Mew のいいところ ・im と mew を入れるだけなので、インストールが簡単 (Wanderlust だと semi やら apel やら入れて、さらに それぞれのバージョンにも気をつけなくてはいけない) てな感じ。インストールに自信がないなら Mew の方がいいかも しれません。 ちなみに「添付ファイルを受け取る」という一点に関して言うと、 Mew の方が使いやすいように感じます。 > そのファイルのシンボリックリンクがどこに作られているかを > 見つけ出す事はできますか? 無理です。全ファイルを調べるしかないです。これはハード リンクも同じです。 > NFS上のファイルをflockすると,複数マシンから > 同時にロックできてしまう(場合がある)と思いますが... んー、なるほど。複数マシンからの flock というのは全く 思いつきませんでした。一つの NFS クライアントマシンから flock して、「ああ、NFS でもうまくロックできるのね」と 思ってました。 試してみたいけど、NFS 環境がないなぁ・・・ |
はじめまして。 勉強になるのでちょくちょく見させてもらっています。 crypt化した文字を復元することはできるのですか? |
申し訳ないです。先ほどの追加です。 crypt化するのにperlでやっています。 #!/usr/bin/perl $A ="AAAAAA"; #←crypt化する文字 $B ="BB"; #←KeyWord print crypt ($A,$B); |
> crypt化した文字を復元することはできるのですか? できないです。復元ができないようなアルゴリズムを採用している からです。なので、辞書を使ったり、総当りで調べるしかありません。 ちなみに keyword じゃなくて salt と言います。 |
unixはぜんぜん知らないのですが、 flockに関しては以前から疑問があったので、 ちょっとお伺いします。 >とか書いた時点で終わってます.2箇所直せば使えますけど >普通そんなこと気付きません. open の時点で $file が破壊されるってことですね。 これは、確かにしっかりしたドキュメントが必要だと思います。 >あと,デッドロックの発生を検知するのが難しいです. flock でデッドロックが発生したら、意味ないのでは…? flock がセマフォを使ってるのか、別の何かを使ってるかは知りませんが、 デッドロックを回避できるからこそ flock の価値があるんではないでしょうか? それとも、セマフォとかの待ち行列の状態が検知できないという意味でしょうか? >Perlで普通にflockを使っていると,たいがい >まともにロックできないうえ処理速度が遅くなります. こういう文章を読んで、flockはダメだと勝手に判断して、 もっと酷い、訳の分からない排他制御手段を考える人が出て来るような気が… ただ、flockを使えばOSが対象ファイルごとに待ち行列を 用意することになるんでしょうから、チャット等が沢山使われるサーバーでは、 リソースを大量に消費して、レスポンスも悪くなるような気はします。 先のプロバイダの制限は、そういうことを嫌ったのではないでしょうか? |
>open の時点で $file が破壊されるってことですね。 はい,あと引数'2'だと,待っている間何も出来なくなるので マズイ,ということで2箇所...としました. シグナル起こしはあてにならないということで. >デッドロックを回避できるからこそ flock の価値があるんではないでしょうか? デッドロックは起きます. flockには価値なんかありません.BSDでの互換性だけです. 言葉遊びでなく,確率というか危険度と考えてください. flockして成功したプロセスが無限ループに入ったとき, 解除にはたいがいプロセス殺しが必要です.うまく殺せるか どうかは不確実なので,この時点でデッドロックといえます. symlinkやmkdirでの排他処理だとまだ通常のファイル操作で済みます. >それとも、セマフォとかの待ち行列の状態が検知できないという意味でしょうか? はい,検知と制御ができません.同じ意味でfcntlやセマフォも 使うのは難しいです.OSリソースを隠れて消費し,工夫しないと システム全体の速度が低下します. OSに付属する排他処理機構を,よく検証せずに使うのはまずいです. 私の経験だと, - いつどのプロセスが何をロックして - それを参照する何個のプロセスがどれくらいの時間待機しているか 外から判るようにしなければだめな感じです. >訳の分からない排他制御手段を考える人が出て来るような気が 他人の手法を参考のうえ,排他処理の仕組みを自分で考えるのは 結構なことだと思います. |
>解除にはたいがいプロセス殺しが必要です.うまく殺せるか >どうかは不確実なので,この時点でデッドロックといえます. なるほど、もし解除できないということが起こるなら、 確かにデッドロックですね。 unixを触ったことがないため、そのヘンは、何となくシステムを 信頼していました(^^; >flockには価値なんかありません.BSDでの互換性だけです. う〜ん、それが現状だとすると、問題ありそう… >言葉遊びでなく,確率というか危険度と考えてください. 確かに、私の先の書き込みは、スパゲッティを食べる哲学者のレベルでの 話かも知れません(^^; >OSに付属する排他処理機構を,よく検証せずに使うのはまずいです. 検証する能力がない人間が下手なことをするよりは、 システムが用意した機能をそのまま利用した方がマシ、 というスタンスでいたのですが、少なくともflockに関しては、 考え直さないといけないみたいですね。 >symlinkやmkdirでの排他処理だとまだ通常のファイル操作で済みます. 今後は、作成時からの経過時間検査による解除機能付きsymlink/mkdirあたりで 検討してみたいと思います。 >他人の手法を参考のうえ,排他処理の仕組みを自分で考えるのは >結構なことだと思います. これは、あくまでもっと低次元の話です。 「他人の手法」を正確に理解し、問題点を的確に把握した上で、 「自分で考える」のであれば、仰る通りすばらしいことだと思います。 |
Netboy さんは、ノンブロッキングの flock なら OK、 という立場ですよね? で、いくつか疑問があります。 > flockには価値なんかありません. fcntl には価値がある、という話でしょうか。それとも 両方価値がない、という話ですか? > flockして成功したプロセスが無限ループに入ったとき, という状況って、起こり得ますか? (現象事態は root が SIGSTOP 送れば容易に発生しますが) Netboy さんは、どういうプログラムを想定しておられます? ちなみに僕が考えたのは、カウンタとか web BBS とかです。 > Perl で普通にflockを使っていると,たいがいまともに > ロックできないうえ処理速度が遅くなります. 僕の環境では「まともにロックできない」というのは 経験したことはありません (1000回カウントアップしたつもりが、 カウンタデータファイルを見ると998回しか実行されていない というのはあった。原因は不明)。 それと flock は、symlink・mkdir よりは速かったです。 しつこいですが、僕の環境では、です。 # あと、排他処理はいつも symlink でやるので、flock を # 使いこんだことはないです。 > 訳の分からない排他制御手段を考える人 http://www2q.biglobe.ne.jp/~terra/cgi/lockfile.htm (笑) |
>http://www2q.biglobe.ne.jp/~terra/cgi/lockfile.htm (笑) あはは、どもです。どこだったか忘れてました。 |
>Netboy さんは、ノンブロッキングの flock なら OK、 >という立場ですよね? はい. 動作環境を知っていて,使えると判断した用途にはOKです. 例えば常駐動作のサーバー用のスクリプトなんかにはいいですよね. >それとも 両方価値がない、という話ですか? いいえ,fcntlは意味があると思います. POSIX準拠(?)+NFS対応だそうですし. あれはOSの内部操作をそのまま出してくれているんですよね? でもWin環境で互換性が無いので,あまり使いません. >> flockして成功したプロセスが無限ループに入ったとき, >という状況って、起こり得ますか? (現象事態は >root が SIGSTOP 送れば容易に発生しますが) 次のようなものです. - スクリプトの単なるバグ - 作成中のスクリプトのテスト時 - 予期しないデータを与えられたスクリプト - Perlインタプリタがコケたとき.OSリソース逼迫下. - インタプリタのバグ. - Apacheの設定ミス,管理者の不注意な設定変更. - クラッキングを受けたサーバー >Netboy さんは、どういうプログラムを想定しておられます? >ちなみに僕が考えたのは、カウンタとか web BBS とかです。 私も同じです. スクリプトのバグでは,機種/環境依存文字の訂正で ある予期しない文字列のとき置換操作が止まらなくなる...など. >僕の環境では「まともにロックできない」というのは >経験したことはありません それは68userさんだから(笑). 普通の人は下で書いたスクリプトみたいな感じです. NFSを使っているプロバイダの場合,もっと状況は複雑になります. >それと flock は、symlink・mkdir よりは速かったです。 う〜ん,負荷が掛かった時なんです,問題は. デッドロックの自動検出と,flockの解除のための pidの保存操作や予防措置も含めてください. MMX233+FreeBSDで1000個の掲示板が同時動作で平均待ちプロセスが2〜4個 の状況('97のテレホ時)でflockを使うかどうか,です. >訳の分からない排他制御手段を考える人 いや,いいんじゃないですか.誰もが通る出発点だと思います. 68userさんだって,miniBBSのアレとか,ほら,悪い思い出(笑). 混雑時の実用性や設置性を検証すると,面白いことになります. |
はじめに、flockについて質問した者です。 CGIをダウンロードした人にプロバイダ来たメールで、 やはり、「NFSがらみで、flockが利用不可能な状態」とのことでした。 CGIの方は、WIN95も考慮して、ロックファイルの有無で対処いたしました。 話は、変りますが、DNSサーバーについて知識として教えて下さい。 rlogin,ftp,telnetなどで、ホスト名を指定した時に、どのようにして、 DNSサーバーとやり取りをしているのですか? DNSサーバーはhttpみたいなデーモンが動いているですか?(私の買った本には、この辺書いていなかった) ちょっと、気になったので、よろしくお願い致します。 |
flock の件は後程。 > rlogin,ftp,telnetなどで、ホスト名を指定した時に、どのようにして、 > DNSサーバーとやり取りをしているのですか? rlogin/ftp/telnet などは、ユーザからホスト名を受け取ると gethostbyname(3) などを使って、ホスト名から IP アドレスを 得ようとします。 gethostbyname の内部では、ソケットを使って DNS サーバに アクセスします。で、DNS サーバは UDP の port 42 を listen していて (UDP だから listen という表現は変?)、 クライアントからの問い合わせに応じて IP アドレスを 教えたり、他の DNS サーバに問い合わせたり、見付から ないよと答えたりします。 こういう問い合わせを行う DNS クライアント (この例では gethostbyname) のことを resolver と言います。resolver は 概念的なもので、問い合わせを一手に引き受ける resolver サーバのようなものがあるわけではありません。ただのライブラリです。 なので、自分で外部の 42/udp にアクセスする DNS クライアントを 書く事もできます。 > DNSサーバーはhttpみたいなデーモンが動いているですか? UNIX 界で DNS サーバとして有名なのは bind です。 プログラム名は named。 # apache と httpd の関係と似ています。 |
> こういう問い合わせを行う DNS クライアント (この例では > gethostbyname) のことを resolver と言います。 いや、違うか。 res_query, res_search, res_mkquery, res_send, res_init, dn_comp などの DNS サーバへ問い合わせを行うライブラリ 関数群のことを resolver といいます。gethostbyname などは これらの関数を孫請けとして呼んでいます、かな。 # See resolver(3). |