Ausführen von untergeordneten Prozessen mit über Pipes übertragenem Stdin und Stdout unter Linux
Unter Linux erfordern Aufgaben, die die Ausführung von untergeordneten Prozessen mit über Pipes geleiteter Standardeingabe (stdin) erfordern ) und Standardausgabe (stdout) können über verschiedene Systemaufrufe oder POSIX-Funktionen erfolgen. Insbesondere für Linux 3.0 und höher umfasst der empfohlene Ansatz die Verwendung von pipe(), fork(), execve() und dup2().
Lösungsübersicht
Pipes erstellen:
Fork-Prozess:
IO-Umleitung im untergeordneten Prozess:
Nicht verwendete Pipes schließen:
Untergeordnete Ausführung:
IO Kommunikation:
Implementierung
Der folgende C-Code demonstriert diese Lösung:
#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; }
Dieser Code wird Führen Sie den Befehl foo mit der Eingabezeichenfolge aus, und die Ausgabe von foo wird auf der Konsole ausgegeben.
Das obige ist der detaillierte Inhalt vonWie führe ich untergeordnete Prozesse mit Piped Stdin und Stdout unter Linux aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!