標準 I/O パラメータをパイプ経由で子プロセスに渡す
目的は、子プロセスを実行する C 関数を作成することです (" foo") を標準入力 ("s") として指定し、子の標準出力を文字列で返します。 variable.
システム コールと POSIX 関数
このタスクには次のシステム コールと POSIX 関数が必要です:
関数の実装
以下の関数は、次の手順に従って、パイプされた標準 I/O を使用して子プロセスを実行します。
子プロセス内:
親プロセス内:
#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 サイトの他の関連記事を参照してください。