Heim >Backend-Entwicklung >C++ >Wie führe ich untergeordnete Prozesse mit Piped Stdin und Stdout unter Linux aus?

Wie führe ich untergeordnete Prozesse mit Piped Stdin und Stdout unter Linux aus?

DDD
DDDOriginal
2024-11-19 15:27:03835Durchsuche

How to Execute Child Processes with Piped Stdin and Stdout in Linux?

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

  1. Pipes erstellen:

    • pipe() verwenden um zwei Pipes zu erstellen: eine für stdin (aStdinPipe) und eine für stdout (aStdoutPipe).
  2. Fork-Prozess:

    • Verwenden Sie fork(), um ein Kind zu erstellen Prozess.
  3. IO-Umleitung im untergeordneten Prozess:

    • Verwenden Sie im untergeordneten Prozess dup2(), um stdin von umzuleiten aStdinPipe[PIPE_READ] zum stdin des Kindes und stdout/stderr zum aStdoutPipe[PIPE_WRITE].
  4. Nicht verwendete Pipes schließen:

    • Schließen Sie die nicht verwendeten Dateideskriptoren von aStdinPipe[PIPE_READ] und aStdoutPipe[PIPE_WRITE] im übergeordneten Element Prozess.
  5. Untergeordnete Ausführung:

    • Verwenden Sie execve() im untergeordneten Prozess, um den gewünschten Befehl auszuführen.
  6. IO Kommunikation:

    • Schreiben Sie im übergeordneten Prozess Daten in aStdinPipe[PIPE_WRITE], um Eingaben für den untergeordneten Prozess bereitzustellen.
    • Lesen Sie Daten aus aStdoutPipe[PIPE_READ], um die zu empfangen untergeordnete Prozesse Ausgabe.

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!

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