Maison  >  Article  >  développement back-end  >  Comment exécuter un processus enfant avec Piped Stdin/Stdout sous Linux ?

Comment exécuter un processus enfant avec Piped Stdin/Stdout sous Linux ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-09 03:52:02657parcourir

How to Execute a Child Process with Piped Stdin/Stdout in Linux?

Exécuter un processus enfant avec Piped Stdin/Stdout sous Linux

Sous Linux, l'exécution d'un processus enfant avec pipedstdin/stdout nécessite une combinaison de Appels système Linux ou fonctions POSIX. Pour y parvenir, nous utiliserons les techniques suivantes :

  1. Création de canal (pipe syscall) : Crée un canal de communication interprocessus unidirectionnel, permettant l'échange de données entre les processus parent et enfant.
  2. Duplication de descripteur de fichier (dup2 syscall) : Duplique un descripteur de fichier existant, utilisé pour rediriger les flux d'entrée ou de sortie.
  3. fork et exec (fork execve syscalls) : Crée un nouveau processus enfant qui exécute une commande spécifiée (dans notre cas, "foo").
  4. Gestion des descripteurs de fichiers : Fermeture des descripteurs de fichiers inutilisés pour éviter les erreurs et garantir l'exactitude des ressources manipulation.

Vous trouverez ci-dessous un exemple C qui implémente ces techniques :

#include <iostream>
#include <unistd.h>
#include <stdlib.h>

using namespace std;

int main() {
  // Input string
  string s = "Hello, world!";

  // Create pipes for stdin and stdout
  int stdinPipe[2], stdoutPipe[2];
  pipe(stdinPipe);
  pipe(stdoutPipe);

  // Fork a child process
  int pid = fork();

  if (pid == 0) {  // Child process
    // Redirect stdin and stdout to pipes
    dup2(stdinPipe[0], STDIN_FILENO);  // Read from pipe
    dup2(stdoutPipe[1], STDOUT_FILENO);  // Write to pipe

    // Close unused file descriptors
    close(stdinPipe[1]);
    close(stdoutPipe[0]);

    // Execute "foo" with piped stdin
    execlp("foo", "foo", NULL);

    // Exit child process on failure
    exit(1);
  } else if (pid > 0) {  // Parent process
    // Close unused file descriptors
    close(stdinPipe[0]);
    close(stdoutPipe[1]);

    // Write to stdin pipe
    write(stdinPipe[1], s.c_str(), s.length());
    close(stdinPipe[1]);

    // Read from stdout pipe
    char buffer[256];
    int bytesRead = 0;
    string output;
    while ((bytesRead = read(stdoutPipe[0], buffer, sizeof(buffer))) > 0) {
      output.append(buffer, bytesRead);
    }
    close(stdoutPipe[0]);

    // Print output string
    cout << output << endl;
  }

  return 0;
}

Cet extrait de code :

  • Crée des tuyaux pour stdin et stdout en utilisant pipe.
  • Forks un processus enfant à l'aide de fork.
  • Chez l'enfant processus, il redirige stdin et stdout vers les tubes en utilisant dup2, puis exécute "foo" avec le tube stdin en utilisant execlp.
  • Dans le processus parent, il ferme les descripteurs de fichiers inutilisés, écrit dans le tube stdin et lit depuis le tube stdout pour capturer la sortie.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn