子プロセスをPerl5〜fork()
にしようとしています。子プロセスは、STDIN
を名前付きパイプにリダイレクトする別のプログラムexec()
とログファイルにSTDOUT
とSTDERR
をリダイレクトする必要があります。親プロセスはループ内で実行を継続し、waitpid
を使用し、$?
をチェックして、ゼロ以外の終了ステータスで終了する場合に子プロセスを再起動します。exec()内でSTDOUTとSTDERRをリダイレクトするシェルなし
exec()
機能のためのPerlのドキュメントは言う:LISTに複数の引数がある場合
、これは、リスト内の引数でexecvpの(3)を呼び出します。 LISTに要素が1つしかない場合は、引数にシェルメタキャラクタがあるかどうかチェックされ、存在する場合は引数全体がシステムのコマンドシェルに渡されます(Unixプラットフォームでは
/bin/sh -c
ですが、他のプラットフォームで異なります)。引き数にシェルメタ文字がない場合は、単語に分割されてexecvp
に直接渡されます。より効率的です。例:これはかなりクールなサウンド、私はこれらの例に示すように、中間のシェルなしで私の外部プログラムを実行したいと思いますexec '/bin/echo', 'Your arguments are: ', @ARGV; exec "sort $outfile | uniq";
。残念ながら、これを出力リダイレクション(/bin/foo > /tmp/stdout
のように)と組み合わせることはできません。言い換えれば
、これは動作しません:
exec ('/bin/ls', '/etc', '>/tmp/stdout');
だから、私の質問は:どのように私はシェルを使用せずに、私のサブコマンドのSTD*
ファイルをリダイレクトするのですか?