2017-11-17 8 views
2

私は、入力ファイルから読み込んで出力ファイルに書き込むmyProgramという実行可能ファイルを持っているとしましょう。このプログラムのコマンドラインは次のようになります。stdinとstdoutを使って同じcプログラムにパイプする

./myProgram -o outputfile inputfile 

-oオプションの引数は、出力ファイル名を指定します。そのようなファイルが存在しない場合、プログラムはそれを作成します。

私はmyProgramを複数回実行できるかどうか、1つのインスタンスの出力を次の入力にパイプすることができないかと思います。たとえば、

./myProgram inputfile | ./myProgram -o outputfile 

これを達成することは可能でしょうか?もしそうなら、私は何を実装しなければなりませんか? execコールとフォーク?単純な読み取りと書き込みの呼び出し?

+0

これは標準的なコマンドラインの動作です。例えばcoreutilsプログラムのソースを確認してください。 ['cat'](http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/cat.c#n655)。 – Max

答えて

1

は絶対にあなたが

./myProgram inputfile | ./myProgram -o outputfile 
+0

シェルにとっては問題ありませんが、OPが望む効果があるかどうかはプログラムによって異なります。その依存関係の詳細は彼が求めているものだと思う。 –

3

パイプが一緒に複数のプログラムの標準入力と標準出力をチェーン化することによって動作コマンドで行うよう一緒にあなたのプログラムMYPROGRAMの2つのインスタンスを実行しても問題ありません。

stdinから読み込み、特定のファイルではなくstdoutに書き込む機能を持たせるには、プログラムを修正する必要があります。その後、パイプを使用することができます。

+0

したがって、2番目のプログラムが実行されると、最初のプログラムのstdoutから正しいものが読み込まれるはずです。または私の論理は間違っていますか? – Kevag6

+0

@ Kevag6正しい。パイプの最初のインスタンスはstdoutに書き込み、パイプの2番目のインスタンスはstdinから読み込みます。 – dbush

+0

...プログラムは、 'stdin'がどこから来た@ Kevag6を知ったり、気にする必要はありません。特に、stdinがパイプに接続されている場合を処理するために特別な処理を行う必要はありません。 –

2

短い答えは:はい、これを行うことができます。

ただし、プログラムはstdinから入力を読み込み、stdoutに書き込む必要があります。つまり、入力ファイルまたは出力ファイルとしての引数はもはや必要ありません。

./myProgram <inputfile> outputfile 

又は、連鎖を例示する、

./myProgram < inputfile | ./myProgram > outputfile 

広く普及組み合わせは、入力ファイルが指定されていない場合は標準入力から読み取られ、無OUTPUTFILE 又は OUTPUTFILE場合stdoutに書き込むことです「 - 」コマンドラインで渡されます。これにより最大の柔軟性が得られます。

同じプログラムの複数のインスタンスをチェーン化することが賢明ならば、もちろんこのプログラムの内容に大きく依存します。たとえば、ソートプログラムの場合、これはあまり意味がないようです;)

関連する問題