0

提供されたファイルの内容を取得して処理し、結果をstdoutを介して画面に出力するバイナリプログラム*があります。自動化スクリプトの場合、名前付きパイプを使用してこのプログラムにデータを送信し、出力を自分で処理したいと思います。スクリプトを機能させようとした後、名前付きパイプからデータを受け入れるバイナリプログラムに問題があることに気付きました。この問題を説明するために、unixシェルを使用したいくつかのテストの概要を説明しました。

  1. 実際のデータファイルを処理することで、プログラムが機能していることを簡単に示すことができます。

    $ binprog file.txt > output.txt
    

    これにより、file.txtからの処理済み情報を含むoutput.txtが作成されます。

  2. 名前付きパイプ(pipe.txt)は、このデモンストレーションで見られるように機能します。

    $ cat pipe.txt > output.txt
    $ cat file.txt > pipe.txt
    

    これにより、パイプを介して送信された後、file.txtからのデータを含むoutput.txtが作成されます。

  3. バイナリプログラムがファイルではなく名前付きパイプから読み取っている場合、物事は正しく機能しません。

    $ binprog pipe.txt > output.txt
    $ cat file.txt > pipe.txt
    

    この場合、catとbinprogが終了した後でも、output.txtにはデータが含まれていません。topとpsを使用すると、binprogが「実行中」で、作業を行っているように見えます。すべてがエラーなしで実行されます。

この3番目の例でbinprogによって生成された出力がないのはなぜですか?

これを機能させるために私が試みることができるいくつかのことは何ですか?

[*]問題のプログラムはlibsvmのsvm-scaleです。例を一般化して、クリーンでシンプルに保つことにしました。

4

3 に答える 3

3

プログラムがパイプで動作すると確信していますか? 入力ファイルへのランダムアクセスが必要な場合、機能しません。プログラムは、入力ファイルをシークしようとするたびにエラーを受け取ります。

プログラムがパイプで動作するように設計されていることがわかっていて、bash を使用している場合は、プロセス置換を使用して、名前付きパイプを明示的に作成する必要がないようにすることができます。

binprog <(cat file.txt) > output.txt
于 2009-03-20T01:48:42.633 に答える
1

binprogはstdinへの入力も受け入れますか?もしそうなら、これはあなたのために働くかもしれません。

cat pipe.txt | binprog > output.txt
cat file.txt > pipe.txt

編集: svm-scaleのマンページを簡単にスキャンしました。代わりにこれを回転させてください:

cat pipe.txt | svm-scale - > output.txt
于 2009-03-20T01:38:40.333 に答える
0

binprog入力として端末以外のものを使用するとうまく動作しない場合は、入力用に (疑似) 端末 (pty) を与える必要があるかもしれません。それを整理するのは難しいですが、expectプログラムはそれを比較的簡単に行う方法の 1 つです。Advanced Programming in the Unix Env​​ironment、W Richard Stevens と Stephen A Rago による第 3 版、およびMarc J Rochkind によるAdvanced Unix Programming、第 2 版では、pty によるプログラミングの議論があります 。

他に確認すべきことは、trussorstraceまたはローカルの同等の出力です。これらのプログラムは、プロセスによって行われたすべてのシステム コールをログに記録します。Solaris では、次のように実行します。

truss -o binprog.truss binprog

対話的に、それが何をするかを見てください。次に、i/o リダイレクトを試してから、名前付きパイプからの i/o リダイレクトを試します。実行内容に大きな違いがあるか、ハングしているシステム コールが表示される場合があります。トラス ログ ファイルにフォークがある場合は、-f子を追跡するために ' ' フラグを追加する必要があります。

于 2009-03-20T03:16:17.557 に答える