Heim >Backend-Entwicklung >C++ >Wie führe ich einen untergeordneten Prozess mit Piped Stdin/Stdout unter Linux aus?

Wie führe ich einen untergeordneten Prozess mit Piped Stdin/Stdout unter Linux aus?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-09 03:52:02708Durchsuche

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

Ausführen eines untergeordneten Prozesses mit Piped Stdin/Stdout unter Linux

Unter Linux erfordert das Ausführen eines untergeordneten Prozesses mit Pipedstdin/Stdout eine Kombination aus Linux-Systemaufrufe oder POSIX-Funktionen. Um dies zu erreichen, verwenden wir die folgenden Techniken:

  1. Pipe-Erstellung (Pipe-Systemaufruf): Erstellt einen unidirektionalen Interprozess-Kommunikationskanal, der den Datenaustausch zwischen übergeordneten und untergeordneten Prozessen ermöglicht.
  2. Dateideskriptor-Duplizierung (dup2-Systemaufruf): Dupliziert einen vorhandenen Dateideskriptor, der zum Umleiten von Eingabe- oder Ausgabeströmen verwendet wird.
  3. fork und exec (Fork-Execve-Systemaufrufe ): Erstellt einen neuen untergeordneten Prozess, der einen bestimmten Befehl ausführt (in unserem Fall „foo“).
  4. Dateideskriptorverwaltung: Schließen nicht verwendeter Dateideskriptoren, um Fehler zu vermeiden und sicherzustellen korrekte Ressourcenbehandlung.

Unten ist ein C-Beispiel, das diese Techniken implementiert:

#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;
}

Dieser Codeausschnitt:

  • Erstellt Pipes für stdin und stdout mit Pipe.
  • Gabelt einen untergeordneten Prozess mit fork.
  • Im untergeordneten Prozess leitet es stdin und stdout mit dup2 an Pipes um und führt dann „foo“ mit gepipetem stdin mit execlp aus.
  • Im übergeordneten Prozess werden nicht verwendete Dateideskriptoren geschlossen, in die stdin-Pipe geschrieben und aus der stdout-Pipe gelesen, um die Ausgabe zu erfassen.

Das obige ist der detaillierte Inhalt vonWie führe ich einen untergeordneten Prozess mit Piped Stdin/Stdout unter Linux aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn