2

少なくとも配管の基本は知っています。ただし、C パイプを使用して C でこのタスクを実装する方法がわかりません。あるプログラムの出力を別のプログラムなどへの入力として取得する方法がわかりません。例えば:

ls | wc | ./add

ここlsにファイルをリストし、リストされたwcファイルの数を示し、./addによって与えられた数を追加しますwc

助けてください!

編集:割り当てです。正確な問題ステートメントは次のように与えられます。

「2 つ (またはそれ以上) の実行可能プログラムの名前を読み取る C プログラムを作成し、最初のプログラムの出力を 2 番目のプログラムの入力にリダイレクトし、2 番目のプログラムの出力を 3 番目のプログラムの入力にリダイレクトするなど。 ...」

4

3 に答える 3

1

pipe(pipefd) を使用してパイプを作成すると、2 つのファイル記述子が取得されます。pipefd[1] に書き込まれたものは何でも、pipefd[0] から読み取ることができます。つまり、stdout が pipefd[1] と同じになるように最初のプログラムを実行し、stdin が pipefd[0] と同じになるように 2 番目のプログラムを実行する必要があります。dup()/close() トリックを使用して、コマンドを実行する直前にファイル記述子の番号を付け直し、0 (stdin) または 1 (stdout) になるようにします。

3 つのプログラムを一緒にパイプする場合、パイプは 2 つになります。中間のプログラムは、最初のプログラムから読み取り、2 番目のプログラムに書き込みます。

于 2012-08-20T12:56:42.667 に答える
1

シェルの仕事の単純なケースを実行するプログラムを作成する必要があるようです。コマンドのパイプラインを作成して実行し、結果を出力します。

これを正しく行うには、、、SIGPIPE子プロセスの処理、入出力のリダイレクト、ファイル記述子、fork()およびexec()、などを理解する必要がありますwait()

パイプラインの作成に関するこの Linux ドキュメンテーション プロジェクトの記事は、正しい道筋を示すのに役立ちます。

于 2012-08-20T06:38:58.230 に答える
0

シェルは、パイプのセットアップとプロセスの作成に関するすべての面倒な作業を処理するため、それについてまったく心配する必要はありません。プログラムの観点からは、これは からの通常の入力です。つまり、やからstdinの通常の入力関数を使用できます。scanffreadstdin

于 2012-08-20T06:16:52.947 に答える