問題タブ [perl-io]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - C に埋め込まれた perl、perlapio - STDIO との相互運用性
PerlIO レイヤーは、stdio.h 関数を (多かれ少なかれ) 簡単にラップする以上のことをしているように見えることに気付きました。stdio.h の関数を介しPerlIO_stdout()
て解決されたファイル記述子を使用しようとすると、失敗します。PerlIO_fileno()
例えば:
私はVC10でこれを試しました。埋め込まれた perl プログラムは別のコンテキストから実行されるため、relocatedStdErr への書き込みが実行されるコンテキストから PerlIO を使用することはできません。
好奇心旺盛な方のために: perl スクリプトを実行し、スクリプトの stdout/stderr の出力をログに転送する必要があります。さらに、これはプラットフォームに依存せずに動作するはずです (Linux、Windows コンソール アプリケーション、win32 デスクトップ アプリケーション)。stdout/stderr を転送するだけでは、Win32 デスクトップ アプリケーションでは動作しません。それがないためです ;) - perl の stdout/stderr を使用する必要があります。
必要な解決策: PerlIO スタックを使用せずに perlio から派生したファイルハンドル (または記述子) に書き込むことができるようにします。
編集 - 私の解決策:
Story Teller が PerlIO_findFILE を指していたので、これでうまくいきました。ここにコードの抜粋があります - 説明については、内部のコメントを参照してください。
#define PERLIO_NOT_STDIO 0
私が実際に理解していない興味深いことの 1 つは、perl のドキュメントでは、PerlIO_findFILE()
. しかし、私にとっては、それがなくても問題なく動作し、さらに、とにかく PerlIO と stdio を一緒に使用するのが好きです。何が何だか分からなかった点です。
c - perlapio - PerlIO_findFILE() は動作しますが、errno を「不正なシーク」に設定します (ESPIPE 29)
この問題は多かれ少なかれ、C に埋め込まれた perl、perlapio、つまりWindows 環境で解決したと思うSTDIO との相互運用性に関連しています。この新しい問題も解決された場合は、完全な解決策を投稿します。
リンクされた質問で、
StoryTeller は当面の問題を解決する
ためのヒントをくれましたが、Linux で同じコードが奇妙に動作します。PerlIO_findFILE()
Perldup2()
は Win32 では異なる動作をしているようです。ここで、dup2()
は のマクロでwin32_dup2()
あり、私が理解している限り、単にdup2()
fromを使用していio.h
ます。
Win32 では、Perl のバージョンは成功時にゼロを返し、エラー時に非ゼロを返しますが、Linux ではデフォルトの ANSIdup2()
が使用され、代わりに新しいファイル記述子が返されます。次に、errno
すべてがうまくいったかどうかを確認する必要があります。
への呼び出しが「不正なシーク」にPerlIO_findFILE()
設定errno
されている場合 (errno 29 - ESPIPE
)、dup
、dup2
などpipe
はerrno
引き続き「不正なシーク」に設定され、さらにチェックerrno
すると同じエラーが表示されます。
(実際には、実際のエラーはなかったので、すべてうまくいきました。また、errno
syscall とチェックの間に別のスレッドが errno をリセットする可能性があるため、チェックによる解決策はスレッドセーフではありません。)
私が持っていることに注意してください
事実上、私はPerl5.14.1を使用しています。
私はここで本当に間違ったことをしていますか?
簡単なコード スニペットを次に示します。