Bagaimana untuk Melaksanakan Proses Kanak-kanak dengan Piped Stdin/Stdout di Linux?

Mary-Kate Olsen
Lepaskan: 2024-11-09 03:52:02
asal
684 orang telah melayarinya

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

Melaksanakan Proses Kanak-kanak dengan Piped Stdin/Stdout dalam Linux

Di Linux, melaksanakan proses anak dengan pipedstdin/stdout memerlukan gabungan Syscalls Linux atau fungsi POSIX. Untuk mencapai matlamat ini, kami akan menggunakan teknik berikut:

  1. Penciptaan Paip (syscall paip): Mencipta saluran komunikasi antara proses satu arah, membenarkan pertukaran data antara proses ibu bapa dan anak.
  2. Penduaan Deskriptor Fail (dup2 syscall): Menduakan deskriptor fail sedia ada, digunakan untuk mengubah hala strim input atau output.
  3. fork dan exec (fork execve syscalls): Mencipta proses anak baharu yang melaksanakan perintah tertentu (dalam kes kami, "foo").
  4. Pengurusan Deskriptor Fail: Menutup fail yang tidak digunakan deskriptor untuk mengelakkan ralat dan memastikan pengendalian sumber yang betul.

Di bawah ialah contoh C yang melaksanakan teknik ini:

#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;
}
Salin selepas log masuk

Coretan kod ini:

  • Mencipta paip untuk stdin dan stdout menggunakan paip.
  • Membantu proses kanak-kanak menggunakan garpu.
  • Dalam proses anak, ia mengubah hala stdin dan stdout ke paip menggunakan dup2 dan kemudian melaksanakan "foo" dengan stdin paip menggunakan execlp.
  • Dalam proses induk, ia menutup fail yang tidak digunakan deskriptor, menulis ke paip stdin, dan membaca daripada paip stdout untuk menangkap output.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Proses Kanak-kanak dengan Piped Stdin/Stdout di Linux?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan