問題タブ [ipcopen3]
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.
perl - Perl IPC :: Open3出力の幅にどのように影響しますか?
/bin/ls
私は次のPerlコードを持っており、ターミナルでの呼び出しが表示するのとまったく同じように表示したいと思います。たとえば、100列のサイズの端末では、改行を挿入する前に最大100文字相当の出力が出力されます。代わりに、このコードは出力行ごとに1つのファイルを出力します。インスタンスにいくつかの端末設定を割り当てる必要があるように感じますが、IO::Pty
運が悪かったので、そのバリエーションを試しました。
更新:元のコードにバッファリングの問題がある可能性があることを期待<$READER>
する呼び出しに置き換えましたが、から受信した出力は1行に1ファイルのままです。sysread
sysread
更新:clone_winsize_from
メソッドを介してIO::Ptyのサイズを変更しようとしたことを示すコードを追加しました。これにより、出力に違いは生じませんでした。
更新:(バージョン1.12のIPC::open3コードを読んで)私が知る限り、ファイルハンドルをopen3
作成するのではなく、パイプを作成せずにタイプIO::Handleの変数を渡すことはできないようですdup
。これは、呼び出したisatty
ときに真の値を返さず、強制的に「1行に1つのファイル」モードになることを意味します。ls
ls
フォーク/実行を実行し、I/Oリダイレクトを自分で処理する必要があると思います。
perl - シンプルな open3 の例が機能しない
子 perl スクリプトを呼び出し、パイプを介して対話するマスター perl スクリプトを作成しようとしています。
私はマスターのためにこのコードを書いています:
そして、これは子供のためのものです:
しかし、マスターを起動すると、彼は子供からの応答を読みながらハングアップしました。
私が何を間違えたのか、そしてその理由について何か考えはありますか?
perl - IPC::Open3::open3() は perl 5.10.1 のように perl 5.14.2 で動作しませんか?
モジュールの 1 つで、特定のバイナリ ( varnishd
) が存在するかどうかを確認し、存在する場合は追加のテストを実行します。
チェックを実行するために、次のIPC::Open3
ように を使用しています (わかりやすくするために例を省略しています)。
Perl 5.10.1を使用した Debian Squeeze または Ubuntu Natty ではvarnishd
、システムに が見つからない場合、これが表示65280
されます。を に変更する$binary
とperl
、(正しく) が出力され0
ます。
ただし、Ubuntu Precise とperl 5.14.2では、これは同じようには機能せず、次のようになります。
$binary
たとえば、 を既存のものに変更するとperl
、正しく動作し、 が出力され0
ます。
他の質問と回答を読むと、 IPC::Runを調べたいように見えますが、実際には:
- この動作の違いを理解する
- 可能であれば、これ以上依存関係を避ける
編集:これがchroot環境で実行されていることを忘れていました.SqueezeシステムとPreciseシステムの両方で、それが関連している場合(/dev
ファイルシステムの違いなど)。
perl - perl: IPC::Open3 が FCGI で STDERR を開くのに失敗する
私は fcgi スクリプトで Git::Repository をテストしていました。git オブジェクトを作成することも、そのモジュールを使用して git コマンドを実行することもできません。IPC::Open3::open3 が次のエラーで失敗しています:
/usr/local/lib/perl/5.10.1/FCGI.pm 行 125 の GLOB 参照ではありません
FCGI::OPEN() にクラックを追加し、IPC::Open3::xopen() に警告を追加したところ、次のようになりました。
FCGI::OPEN() は、STDERR が開かれたときにのみ呼び出されます。STDIN と STDOUT は FCGI::OPEN() に到達しません。私は IPC::Open3 を見ましたが、これが失敗している場所です:
open3 を IPC::Run::start に置き換えると、すべて正常に動作します。しかし、ここで STDERR の何が問題なのかを理解したいと思っています。FCGI.pm または Open3.pm のバグですか、それとも何か間違っていますか?
debian スクイーズで、libapache2-mod-fcgid 1:2.3.6、libfcgi-perl 0.71-1、および libcgi-fast-perl 5.10.1 で apache 2.2.16 を実行しています。Perl のバージョンは 5.10.1 です。
再現方法:
apache - perl / embperl -- IPC::Open3
perl と embperl の 2 つの形式のサンプル プログラムがあります。
perl 版は CGI として動作しますが、embperl 版は動作しません。
解決策への提案や指針をいただければ幸いです
OS: Linux バージョン 2.6.35.6-48.fc14.i686.PAE (...) (gcc バージョン 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC) ) #1 SMP Fri Oct 22 15:27: 53 UTC 2010
注: 私はもともとこの質問を perlmonks [x]と embperl メーリング リスト[x]に投稿しましたが、解決策が得られませんでした。
perl作業スクリプト
emperlの動かないスクリプト
ここに私が受け取る出力があります