0

PHP の を使用して、プロセスを開始し、プロセスの実行中に一度に(個別に) 任意のバイト数をproc_open()読み取り、STDOUTおよびパイプを使用してプロセスが完了したことを検出し、を使用して終了コードを取得できます。プロセスの。私はこれをすべてPHPで行いました。それはうまく機能し、私に多くの制御を与えてくれます。STDERRfread()feof()STDOUTSTDERRproc_close()

これらすべてを Perl で行う方法はありますか? 要約すると、次のことができる必要があります。

  • 外部プロセスを開始する
  • 別々に読んSTDOUTSTDERR
  • STDOUTプロセスの実行中に一度に任意のバイト数を読み取りSTDERRます (つまり、プロセスが終了するのを待つ必要はありません)。
  • プロセスがいつ終了したかを検出する
  • プロセスの終了コードを取得する

ご回答ありがとうございます。

4

3 に答える 3

3

Perl のシステム コール インターフェイスを使用して独自のソリューションを展開することもできますが、組み込みモジュール IPC::Open3 を使用する方が簡単です。あなたのリストについては:

外部プロセスを開始します。

use IPC::Open3;
use IO::Handle;
use strict;

my $stdout = IO::Handle->new;
my $stderr = IO::Handle->new;
my $pid = open3(undef, $stdout, $stderr, 'my-command', 'arg1', 'arg2');

STDOUT と STDERR を別々に読み取り、一度に任意のバイト数を読み取ります。

my $line = <$stdout>;
# Or
sysread $stderr, my $buffer, 1024;

プロセスがいつ終了したかを検出します。

use POSIX qw(sys_wait_h);

waitpid $pid, 0;  # Waits for process to terminate
waitpid $pid, WNOHANG;  # Checks if the process has terminated

プロセスの終了コードを取得します。

my $status = $?;  # After waitpid indicates the process has exited

IPC::Open3 のドキュメントを必ず読んでください。警告されているように、注意しないと、stdout パイプと stderr パイプが別々にあると、簡単にデッドロックしてしまいます。子プロセスがいずれかのパイプを満たすとブロックされ、親プロセスがもう一方のパイプを読み取るブロックされます。

于 2010-10-03T05:07:00.787 に答える
2

このモジュールが必要です: IPC::Open3

于 2010-10-03T04:43:51.527 に答える
1

IPC::Run が必要です。これは IO をキャプチャし、終了値を返します

于 2010-10-03T10:28:37.943 に答える