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

Mary-Kate Olsen
リリース: 2024-11-09 03:52:02
オリジナル
684 人が閲覧しました

How to Execute a Child Process with Piped Stdin/Stdout in Linux?

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

Linux で、pipedstdin/stdout を使用して子プロセスを実行するには、次の組み合わせが必要です。 Linux syscall または POSIX 関数。これを実現するには、次の手法を利用します。

  1. パイプ作成 (pipe syscall): 一方向のプロセス間通信チャネルを作成し、親プロセスと子プロセス間のデータ交換を可能にします。
  2. ファイル記述子の複製 (dup2 syscall): 入力ストリームまたは出力ストリームのリダイレクトに使用される既存のファイル記述子を複製します。
  3. fork および exec (fork execve syscalls) ): 指定されたコマンド (この場合は「foo」) を実行する新しい子プロセスを作成します。
  4. ファイル記述子管理: エラーを防止し、使用されていないファイル記述子を閉じます。正しいリソース処理。

以下は、これらの手法を実装する C の例です。

#include <iostream>
#include <unistd.h>
#include <stdlib.h>

using namespace std;

int main() {
  // Input string
  string s = "Hello, world!";

  // Create pipes for stdin and stdout
  int stdinPipe[2], stdoutPipe[2];
  pipe(stdinPipe);
  pipe(stdoutPipe);

  // Fork a child process
  int pid = fork();

  if (pid == 0) {  // Child process
    // Redirect stdin and stdout to pipes
    dup2(stdinPipe[0], STDIN_FILENO);  // Read from pipe
    dup2(stdoutPipe[1], STDOUT_FILENO);  // Write to pipe

    // Close unused file descriptors
    close(stdinPipe[1]);
    close(stdoutPipe[0]);

    // Execute "foo" with piped stdin
    execlp("foo", "foo", NULL);

    // Exit child process on failure
    exit(1);
  } else if (pid > 0) {  // Parent process
    // Close unused file descriptors
    close(stdinPipe[0]);
    close(stdoutPipe[1]);

    // Write to stdin pipe
    write(stdinPipe[1], s.c_str(), s.length());
    close(stdinPipe[1]);

    // Read from stdout pipe
    char buffer[256];
    int bytesRead = 0;
    string output;
    while ((bytesRead = read(stdoutPipe[0], buffer, sizeof(buffer))) > 0) {
      output.append(buffer, bytesRead);
    }
    close(stdoutPipe[0]);

    // Print output string
    cout << output << endl;
  }

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

このコード スニペット:

  • 標準入力およびstdout using Pipe.
  • fork を使用して子プロセスをフォークします。
  • 子プロセスでは、dup2 を使用して stdin と stdout をパイプにリダイレクトし、execlp を使用してパイプされた stdin で「foo」を実行します。
  • 親プロセスでは、未使用のファイル記述子を閉じ、stdin パイプに書き込み、stdout パイプから読み取って出力をキャプチャします。

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

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