5

私は現在、Linux で小さな C プログラムに取り組んでいます。以下のサンプルLinuxコマンドで何をしたいのかを説明しましょう

ls | grep hello

上記のコマンドは、以下のパッションで実行されます (間違っていたら教えてください)

  1. ls コマンドが最初に実行されます
  2. 出力は grep コマンドに渡され、"hello" に一致する出力が再び生成されます。

ここで、1 つのコマンドのパイプ出力を入力として受け取る C プログラムを書きたいと思います。つまり、「grep」プログラムが ls コマンドから入力を取得する方法と同様の情熱で (上記の例で)。

ここで別のユーザーから同様の質問がありましたが、何らかの理由でこのスレッドは「有効な質問ではありません」とマークされています。

私は当初、これを C プログラムのコマンド ライン引数として取得できると考えていました。しかし、そうではありません。

4

2 に答える 2

4

あるコマンドからの出力を別のコマンドにパイプすると、その出力は受信プロセスの標準入力 (stdin) で利用できるようになります。

scanf通常のorfread関数を使用してアクセスできます。scanfなどはデフォルトで stdin で動作します (デフォルトprintfで stdout で動作するのと同じ方法で、パイプがない場合、stdin は端末に接続されます)。C 標準ライブラリは、FILE から読み取るFILE *stdinような for 関数を提供します。freadストリーム。

POSIX では、代わりに 1 つのファイル記述子を操作する関数用STDIN_FILENOに、マクロも用意されています。unistd.hこれは本質的に常に 0 ですが、それを当てにするのは良くありません。

于 2013-06-01T18:06:52.540 に答える
0

実際にはlsgrep同時に開始します。

ls | grep helloつまり、lsの標準出力をgrepの標準入力として使用します。ls結果を標準出力に書き込みgrep、標準入力からの出力を待機して一度に読み取ります。

まだ疑問がありますか?実験を行います。走る

find / | grep usr

find /コンピューター上のすべてのファイルを一覧表示しますが、かなり時間がかかります。

最初に実行lsすると、OS は出力を に渡します。終了して開始さgrepれるまで、空白の画面で長時間待つ必要があります。でも、結果がすぐにわかる、それがその証拠です。findgrep

于 2013-06-01T18:08:23.813 に答える