ホームページ  >  記事  >  バックエンド開発  >  C でパイプされた標準 I/O を使用して子プロセスを実行する方法

C でパイプされた標準 I/O を使用して子プロセスを実行する方法

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-10 14:08:02598ブラウズ

How to Execute a Child Process with Piped Standard I/O in C  ?

標準 I/O パラメータをパイプ経由で子プロセスに渡す

目的は、子プロセスを実行する C 関数を作成することです (" foo") を標準入力 ("s") として指定し、子の標準出力を文字列で返します。 variable.

システム コールと POSIX 関数

このタスクには次のシステム コールと POSIX 関数が必要です:

  • pipe() : 親プロセスと子プロセス間の通信用のパイプを作成します。
  • fork(): 新しいフォークを作成します。子プロセス。
  • dup2(): ファイル記述子を別の記述子に複製します。
  • execve(): 現在のプロセスで新しいプログラム イメージを実行します。
  • write() : ファイル記述子にデータを書き込みます。
  • read(): ファイルからデータを読み取りますdescriptor.

関数の実装

以下の関数は、次の手順に従って、パイプされた標準 I/O を使用して子プロセスを実行します。

  1. 標準入力用と標準入力用の 2 つのパイプを作成します出力。
  2. 新しい子プロセスをフォークします。
  3. 子プロセス内:

    • 標準入力を入力パイプの読み取り端にリダイレクトします。
    • 標準出力と標準エラーを出力パイプの書き込み側にリダイレクトします。
    • 閉じる親から継承されたすべての未使用のファイル記述子。
    • execve() を使用して子プログラム ("foo") を実行します。
  4. 親プロセス内:

    • パイプの未使用の端を閉じます。
    • 書き込み入力文字列を入力パイプの書き込み側に渡します。
    • 出力パイプの読み取り側から子の標準出力を読み取り、保存します。
    • fork( を使用して子プロセスが完了するまで待ちます) ).
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

#define PIPE_READ 0
#define PIPE_WRITE 1

string f(string s) {
  int inputPipe[2];
  int outputPipe[2];
  pid_t childPid;
  char c;
  string result;

  if (pipe(inputPipe) < 0 || pipe(outputPipe) < 0) {
    perror("Error creating pipes");
    return "";
  }

  if ((childPid = fork()) == -1) {
    perror("Error creating child process");
    return "";
  } else if (childPid == 0) {  // Child process
    // Redirect standard input
    if (dup2(inputPipe[PIPE_READ], STDIN_FILENO) < 0) {
      perror("Error redirecting standard input");
      exit(errno);
    }

    // Redirect standard output and standard error
    if (dup2(outputPipe[PIPE_WRITE], STDOUT_FILENO) < 0) {
      perror("Error redirecting standard output");
      exit(errno);
    }
    if (dup2(outputPipe[PIPE_WRITE], STDERR_FILENO) < 0) {
      perror("Error redirecting standard error");
      exit(errno);
    }

    // Close unused pipes
    close(inputPipe[PIPE_READ]);
    close(inputPipe[PIPE_WRITE]);
    close(outputPipe[PIPE_READ]);

    // Execute child process
    execl("/bin/sh", "sh", "-c", s.c_str(), NULL);
    perror("Error executing child process");
    exit(errno);
  } else {  // Parent process
    // Close unused pipes
    close(inputPipe[PIPE_READ]);
    close(outputPipe[PIPE_WRITE]);

    // Write input string to child's standard input
    write(inputPipe[PIPE_WRITE], s.c_str(), s.size());

    // Read output from child's standard output
    while (read(outputPipe[PIPE_READ], &c, 1) > 0) {
      result += c;
    }

    // Close pipes
    close(inputPipe[PIPE_WRITE]);
    close(outputPipe[PIPE_READ]);

    // Wait for child to finish
    waitpid(childPid, NULL, 0);
  }

  return result;
}

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。