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

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

Mary-Kate Olsen
リリース: 2024-11-10 14:08:02
オリジナル
672 人が閲覧しました

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( を使用して子プロセスが完了するまで待ちます) ).

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

#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 サイトの他の関連記事を参照してください。

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