1

これはおそらく奇妙な質問だと思いますが、次のようなコマンドをシステムに送信できるプログラムがあるとします。

system(command);

プログラムは、「ls -l」などのパラメーターを介して実行し、他のプログラムにコマンドを送信できます。

ただし、scanf を使用するなど、インタラクティブな入力を必要とするプログラムがある場合、C プログラムがそれと効果的に対話できるようにする簡単な方法はありますか。

私のリクエストを説明するのが難しくて申し訳ありません。これは、簡潔に説明できない理由による技術的な問題の演習です。

4

2 に答える 2

2

私のCプログラムが効果的に対話できるようにする簡単な方法はありますか。

はい、おそらく探しているでしょうpopen(3)。コマンドを実行し、その/FILE *にアタッチされたを提供します。stdinstdout

悲しいことに、Linux では、同時に両方ではなく、標準入力または標準出力の一方通行です。少なくとも 1 つの他の実装 (FreeBSD) では、双方向パイプが許可されています。

于 2013-01-08T20:23:44.977 に答える
1

通常、次のパターンを使用します。

  1. pipe()子プロセスの stdin として使用されるファイル記述子のペアを開くために使用します。(またはpipe2()Linuxの下で)
  2. pipe()子プロセスの stdout として使用されるファイル記述子のペアを開くために使用します。
  3. コールしfork()ます。これで、親プロセスと新しい子プロセスの 2 つのプロセスができました。
  4. 子プロセス (すなわちfork() == 0)
    1. dup2()上記のステップ 1 と 2 で作成されたファイル記述子から、新しい STDIN_FILENO と STDOUT_FILENO を作成するために使用します。
    2. 関数の 1 つを使用exec()して、新しいプログラムを開始します。
  5. 親プロセス (すなわちfork() > 0)
    1. 上記の手順 1 と 2 で作成したパイプの未使用の側面を閉じます。
    2. 子プロセスの終了を検出、使用waitpid()
    3. 残りのパイプ ファイル記述子を閉じます。

dup2()3番目のパイプを作成してSTDERR_FILENOに渡すことで、子プロセスからstderrをキャプチャすることもできます

man pipeパイプの使用方法を示すコードのスニペットがあります。そして、このパターンの他の例があります

于 2013-01-08T23:14:04.313 に答える