私は、提供されたファイルの内容を取り出して処理し、結果をstdoutを通して画面に出力するバイナリプログラム*を持っています。オートメーションスクリプトでは、名前付きパイプを使用してデータをこのプログラムに送信し、出力を自分自身で処理したいと考えています。スクリプトを動作させようとすると、名前付きパイプからのデータを受け入れるバイナリプログラムに問題があることがわかりました。この問題を説明するために、私はUNIXシェルを使っていくつかのテストを概説しました。名前付きパイプの問題をどのように解決しますか?
実際のデータファイルを処理することによってプログラムが動作することを示すのは簡単です。
$ binprog file.txt > output.txt
これにより、file.txtから処理された情報を含むoutput.txtが生成されます。
名前付きパイプ(pipe.txt)は、このデモンストレーションのとおり動作します。
$ cat pipe.txt > output.txt $ cat file.txt > pipe.txt
これにより、pipe.txtからのデータがパイプを介して送信された後にoutput.txtに格納されます。
ファイルの代わりに名前付きパイプからバイナリプログラムを読み取っているとき、正常に動作しません。
$ binprog pipe.txt > output.txt $ cat file.txt > pipe.txt
この場合、catとbinprogが終了してもoutput.txtにはデータは含まれません。 topとpsを使って、私はbinprogが "走っている"のを見て、一見仕事をしています。すべてがエラーなしで実行されます。
この3番目の例では、binprogによって出力が生成されないのはなぜですか?
私はこれを動作させるために何かを試みることができますか?
[*]問題のプログラムは、libsvmからsvm-scaleです。私は、それらをきれいでシンプルに保つために例を一般化することを選んだ。
名前付きパイプへの書き込みを開始する前にbinprogを起動すると、binprog read()が "file"(pipe.txt)を実行したときに、作動エラーコードに関係なく0バイトが出力される可能性があります、ちょうど終了します。 binprogの前にcatを実行したらどうなりますか? –
Antti.huima、私は最初にパイプにデータをパイプし、その後にbinprogプロセスを開始しようとしましたが、違いはありません。まったく同じことが起こります。 – Nixuz
バックグラウンドで 'cat pipe.txt> output.txt'を実行する必要はありませんか?同様に 'binprog'? –