1

ファイル記述子はWindowsでサポートされていますか?なぜPerlでfdsを使って物事が「うまくいくように見える」のですか?

「fileno」、「dup」、「dup2」などは機能していましたが、他の環境内でランダムに機能を停止しました。詳細を説明するのは難しいですが、主に私が探しているのは、経験豊富なWindowsプログラマーからの回答と、ファイル記述子がWindowsでどのように機能するか/機能しないかです。

ゲームをプレイし、ファイル記述子が機能しているように見せかけるのはPerlIOレイヤーだと思いますが、それは単なる推測です。

起こっていることの例:

open($saveout, ">&STDOUT") or die();
...
open(STDOUT, ">&=".fileno($saveout)) or die();

2行目はdie()ですが、特定の状況でのみです(まだ特定していません)。

4

1 に答える 1

1

Windows は、ファイル記述子をネイティブに使用します。MSDNの低レベル I/O を参照してください。それらはすべて C 変数を介してエラーを報告しますerrno。つまり、Perl の に表示され$!ます。

入力の手間を少し省けることに注意してください。

open(STDOUT, ">&=", $saveout) or ...;

in perlfuncのドキュメントがopen以下を提供しているため、これは機能します。

3 引数形式を使用する場合は、数値、ファイルハンドルの名前、または通常の「グロブへの参照」のいずれかを渡すことができます。</p>

最後に、を呼び出すときは常にdie意味のある診断を含めてください。以下のプログラムは、自身を識別し ( $0)、何をしようとしていたか ( open)、なぜ失敗したか ( $!) を示します。また、メッセージは改行で終わらないため、dieファイルの名前とそれが呼び出された行番号を追加します。

my $fakefd = 12345;
open(STDOUT, ">&=", $fakefd) or die("$0: open: $!");

これにより、

prog.pl: open: foo.pl 行 2 のファイル記述子が正しくありません。

(because you used and not ) のドキュメントに_fdopenよると、2 つの障害モードがあります。>&=>&

実行の続行が許可されている場合、errnoは に設定されEBADF、不正なファイル記述子をEINVAL示すか、モードが NULL ポインターであったことを示す に設定されます。

perlio.c2 番目は perl のバグであり、計算モードを含む場所が見当たらないため、非常にありそうにありません。それらはすべて静的な文字列です。

で問題が発生したよう$saveoutです。復元$saveoutする前に閉じられた可能性がありますか? あなたの例から、strictプラグマを有効にしたかどうかは不明です。レキシカルでない ( で宣言されているmy) 場合、 でサルをする関数を呼び出しています$saveoutか?

于 2010-07-03T13:01:43.803 に答える