Linux でパイプされた Stdin および Stdout を使用して子プロセスを実行する方法

DDD
リリース: 2024-11-19 15:27:03
オリジナル
787 人が閲覧しました

How to Execute Child Processes with Piped Stdin and Stdout in Linux?

Linux でパイプされた Stdin および Stdout を使用して子プロセスを実行する

Linux では、パイプされた標準入力 (stdin) を使用して子プロセスの実行を必要とするタスク) および標準出力 (stdout) は、さまざまな syscall または POSIX 関数を通じて実行できます。具体的には、Linux 3.0 以降の場合、推奨されるアプローチには、pipe()、fork()、execve()、および dup2() の使用が含まれます。

ソリューションの概要

  1. 作成パイプ:

    • pipe() を使用して 2 つのパイプを作成します。1 つは標準入力 (aStdinPipe) 用、もう 1 つは標準出力 (aStdoutPipe) 用です。
  2. フォークプロセス:

    • fork() を使用して子プロセスを作成します。
  3. 子での IO リダイレクト:

    • 子プロセスで、dup2() を使用してリダイレクトしますaStdinPipe[PIPE_READ] から子の stdin に、stdout/stderr から aStdoutPipe[PIPE_WRITE] に変換します。
  4. 未使用のパイプを閉じる:

    • 閉じる親プロセスの aStdinPipe[PIPE_READ] および aStdoutPipe[PIPE_WRITE] の未使用のファイル記述子。
  5. 子実行:

    • 子プロセスで execve() を使用して、目的のプロセスを実行しますcommand.
  6. IO 通信:

    • 親プロセスで、データを aStdinPipe[PIPE_WRITE] に書き込み、入力を提供します
    • からのデータの読み取りaStdoutPipe[PIPE_READ] を使用して、子プロセスの出力を受信します。

実装

次の C コードは、この解決策を示しています。

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <unistd.h>
#include <fcntl.h>

using namespace std;

int main() {
  int aStdinPipe[2], aStdoutPipe[2];
  pid_t childPid;
  char buffer[1024];
  const char* command = "foo";
  string input = "Hello World!";

  // Create pipes
  if (pipe(aStdinPipe) == -1 || pipe(aStdoutPipe) == -1) {
    cerr << "Error creating pipes." << endl;
    return EXIT_FAILURE;
  }

  // Fork child process
  childPid = fork();
  if (childPid == -1) {
    cerr << "Error creating child process." << endl;
    return EXIT_FAILURE;
  }

  // Redirect IO in child process
  if (childPid == 0) {
    // Child process
    if (dup2(aStdinPipe[PIPE_READ], STDIN_FILENO) == -1 ||
        dup2(aStdoutPipe[PIPE_WRITE], STDOUT_FILENO) == -1 ||
        dup2(aStdoutPipe[PIPE_WRITE], STDERR_FILENO) == -1) {
      cerr << "Error redirecting IO in child." << endl;
      return EXIT_FAILURE;
    }

    // Close unused pipes
    close(aStdinPipe[PIPE_READ]);
    close(aStdinPipe[PIPE_WRITE]);
    close(aStdoutPipe[PIPE_WRITE]);

    // Execute command
    execve(command, NULL, NULL);
  }

  // Close unused pipes in parent process
  close(aStdinPipe[PIPE_READ]);
  close(aStdoutPipe[PIPE_WRITE]);

  // Write input to child process
  write(aStdinPipe[PIPE_WRITE], input.c_str(), input.length());

  // Read output from child process
  int numBytesRead = 0;
  while ((numBytesRead = read(aStdoutPipe[PIPE_READ], buffer, sizeof(buffer))) > 0) {
    cout.write(buffer, numBytesRead);
  }

  // Close remaining pipes
  close(aStdinPipe[PIPE_WRITE]);
  close(aStdoutPipe[PIPE_READ]);

  return EXIT_SUCCESS;
}
ログイン後にコピー

このコードは、次のコマンドを使用して foo コマンドを実行します。文字列を入力すると、foo の出力がコンソールに出力されます。

以上がLinux でパイプされた Stdin および Stdout を使用して子プロセスを実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート