Linux でパイプされた Stdin および Stdout を使用して子プロセスを実行する
Linux では、パイプされた標準入力 (stdin) を使用して子プロセスの実行を必要とするタスク) および標準出力 (stdout) は、さまざまな syscall または POSIX 関数を通じて実行できます。具体的には、Linux 3.0 以降の場合、推奨されるアプローチには、pipe()、fork()、execve()、および dup2() の使用が含まれます。
ソリューションの概要
作成パイプ:
フォークプロセス:
子での IO リダイレクト:
未使用のパイプを閉じる:
子実行:
IO 通信:
実装
次の 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 サイトの他の関連記事を参照してください。