Maison >développement back-end >C++ >Comment exécuter des processus enfants avec Piped Stdin et Stdout sous Linux ?
Exécution de processus enfants avec canalisation Stdin et Stdout sous Linux
Sous Linux, les tâches nécessitant l'exécution de processus enfants avec entrée standard canalisée (stdin ) et la sortie standard (stdout) peuvent être réalisées via divers appels système ou fonctions POSIX. Plus précisément, pour Linux 3.0 et supérieur, l'approche recommandée implique l'utilisation de pipe(), fork(), execve() et dup2().
Présentation de la solution
Créer des tuyaux :
Processus Fork :
Redirection IO dans l'enfant :
Fermer les tuyaux inutilisés :
Exécution enfant :
Communication IO :
Implémentation
Le code C suivant illustre cette solution :
#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; }
Ce code exécutera la commande foo avec la chaîne d'entrée input, et la sortie de foo sera imprimée sur la console .
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!