[過去ログ] Perlについての質問箱 64箱目 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
934(1): 2021/03/07(日)10:45 ID:Q92Mc+WL(1/4) AAS
安定して動かないならバグっている
だいたい動くけど、ごく稀に動作がおかしい、ということがforkはある
forkがコケても動くような仕組みにすればok
935: 2021/03/07(日)10:50 ID:x9JK9zFw(1/2) AAS
そもそもWindows APIはfork()をサポートしてない。
936: 2021/03/07(日)11:48 ID:Anqe+9Rf(2/4) AAS
>>934 ありがとう。
メモリ使用量が低いと成功。
firefoxでもタブ1枚ぐらいなら成功。
firefoxでタブ(yahoo.com)10枚開くと、確実にハング。
ラクダ本にも、失敗(戻り値undef)の対処法が書いてありますね。
WindowsOSがらみなので、イロイロありそうなのは察します。
でも、forkを呼び出したらハングして帰ってこないからなぁ。
コケるというよりは、forkを呼び出さない:
if( $can_fork ) {fork;}
ってな書き方が必要になってしまう。
937: 2021/03/07(日)11:53 ID:Anqe+9Rf(3/4) AAS
追記:
perlスクリプトとfirefoxは関係ありません。
単に、デスクトップで調べものしながら、コマンドプロンプトでperlインタプリタ
を起動して作業しているだけです。連投失礼しました。
938(1): 2021/03/07(日)12:10 ID:3xq9+JKJ(1) AAS
ActivePerl の Windows 版では fork() がエミュレーションされているらしい。
実際に呼び出してみるとスレッドがひとつ増える。
中ではおおかた CreateThread() でもしてるんだろう。
939(1): 2021/03/07(日)12:24 ID:xy+MS7Fg(1) AAS
windowsで安定動作させたいならforkを使わずに自分で別スレッドか別プロセス立てるのが吉
940: 2021/03/07(日)14:22 ID:Anqe+9Rf(4/4) AAS
>>938
perldocによると、ActiveStateとMSが頑張ったらしいよ。
エミュあつかいとのことです。
>>939 ありがとう。
スレッドでするわ・・・さすがにハングはだめだわ(^^;
941: 2021/03/07(日)14:48 ID:Q92Mc+WL(2/4) AAS
forkとか再帰呼び出しとか、魔術的で楽しいけど、大抵罠にはまる
942: 2021/03/07(日)17:38 ID:quYd9iFF(1/2) AAS
再帰はええやろ。
forkはもともとUNIX用で、Windowsとは相性が激悪なだけやから、しゃあない。
943(1): 2021/03/07(日)17:49 ID:Q92Mc+WL(3/4) AAS
階層ディレクトリを辿る、みたいなとこに再帰を使うと止まらなくなったりする
絶対止まると保証されてるとこにしか使えなくて、そういうのは別に再帰でなくてもやれる
隅々までどうなってるか判らないものに再帰は威力を発揮するけど、
そういうのは往々にして停止性が保証されない
944: 2021/03/07(日)18:11 ID:eIiM+J9a(1) AAS
それはあんたが無能だから
945: 2021/03/07(日)18:18 ID:x9JK9zFw(2/2) AAS
Perlと関係ない話はよそでどうぞ
946: 2021/03/07(日)23:39 ID:quYd9iFF(2/2) AAS
>>943
再帰終了をちゃんとできないヤツは、ループ終了もできないやろ。w
ディレクトリうんぬんに限って言えば、ファイルシステムへの知識が足りないとかか。
リンク系の。
947(1): 2021/03/07(日)23:53 ID:Q92Mc+WL(4/4) AAS
軽く考えてるけど、プログラムの停止性ってもっそい奥が深い
ゲーデルの不完全性定理と密接に絡んでる
948: 2021/03/08(月)00:03 ID:RDgJTpCR(1) AAS
tarのhオプションってよくできているよな
無限ループに陥りやすいが
949: 2021/03/08(月)00:23 ID:tQicr2bh(1) AAS
再帰処理は考えてるの楽しいよな
実装するかとなると状況次第
950: 2021/03/08(月)01:47 ID:6lKYXbK2(1/4) AAS
>>947
バグが存在しない証明は超難しいから、ふつうやらない。
かわりに、テストを必要なだけする。
それだけのこと。
原理とやらは学者に任せておけばいい。
951: 2021/03/08(月)10:04 ID:XzCJxGl3(1) AAS
ggl先生に "perl dir tree" で検索かけたら自作ページが多いね。
安心安全鉄板ライブラリとかってあるかな?
素人考えでなんだけど・・・OS別、FS別なんてあるんかの。
952(1): 2021/03/08(月)10:17 ID:SORPad+v(1/3) AAS
親にリンクしていてループするのが困るので、
全部の子に対してカウンタを持たせる、くらいしか回避方法が無いんだよな
それだと再帰でやってるうまみが無くなってしまう
953: 2021/03/08(月)12:03 ID:JySUELLY(1) AAS
素直にFile::Find使っとけ
954: 2021/03/08(月)12:34 ID:SORPad+v(2/3) AAS
dir /s の結果を使うのが一番楽
955(1): 2021/03/08(月)16:27 ID:3P7OMB5d(1/4) AAS
File::Findは処理速度が遅いのが難
956: 2021/03/08(月)17:21 ID:6lKYXbK2(2/4) AAS
>>952
リンクを不用意にたどるな。
既存コマンドでもオプションにしがちだし、ディレクトリ構成によっては死ぬくらいだから、しゃあない。
957(1): 2021/03/08(月)17:24 ID:6lKYXbK2(3/4) AAS
>>955
何と比べて?
no_chdirを指定したりしたらマシになったりしない?
958: 2021/03/08(月)17:40 ID:SORPad+v(3/3) AAS
ディレクトリならどこかにある実体のコピーだろうから、リンクなんか無しで済むけど、
より一般化したリスト構造だったら辿らない訳にいかない
だから、事前にループしていないことを確認してから処理することになって、
そのテストがループにはまる
959: 2021/03/08(月)20:06 ID:3P7OMB5d(2/4) AAS
>>957
試してみたが、no_chdirは関係ない。
File::Findは、dir /S /B コマンドのパイプ読み取りに比べて、3倍も時間がかかる。
File::Findは遅いだけでなくコールバックでユーザー変数を扱えない欠点があるから、私はFile::Findを使わない。
960(1): 2021/03/08(月)21:30 ID:3P7OMB5d(3/4) AAS
File::FindはUnix系OSで使う場合は find コマンドのパイプ読み取りと同等か少し速い。
File::Findが明確に遅いのはWindows向けにビルドされたPerlの場合のみ。
961(1): 2021/03/08(月)22:05 ID:6lKYXbK2(4/4) AAS
>>960
WindowsのどのPerl?
ひょっとしてCygwin版?
ActivePerlやMSYS2版ならマシだったり?
962(1): 2021/03/08(月)22:39 ID:3P7OMB5d(4/4) AAS
>>961
残念ながらネイティブに最適化されているはずのActivePerl や Strawberry Perl でFile::Findが遅い。
原因は知らないけどWin32APIの使い方が良くないからだと思う。
963: 532 2021/03/09(火)00:11 ID:jxvXMO9/(1/2) AAS
$^WIN32_SLOPPY_STAT じゃね?
File::FindはWindowsだと、SJISで全角「構」などの2バイト目が\(0x5c)のフォルダに遭遇すると
無限loopしたり誤動作するから、結局Wndowsでフォルダ階層を再帰的にたどるには
utf8化したperl sourceで自分でopendir, readdirして、encode, decodeせにゃならん。
上下前次1-新書関写板覧索設栞歴
あと 39 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.021s