Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Melaksanakan Proses Kanak-kanak dengan Piped Standard I/O dalam C ?

Bagaimana untuk Melaksanakan Proses Kanak-kanak dengan Piped Standard I/O dalam C ?

Mary-Kate Olsen
Lepaskan: 2024-11-10 14:08:02
asal
681 orang telah melayarinya

How to Execute a Child Process with Piped Standard I/O in C  ?

Meluluskan Parameter I/O Standard kepada Proses Kanak-kanak melalui Paip

Objektifnya adalah untuk mencipta fungsi C yang melaksanakan proses anak (" foo") dengan rentetan yang dibekalkan sebagai input standard ("s") dan mengembalikan output standard kanak-kanak dalam pembolehubah rentetan.

Panggilan Sistem dan Fungsi POSIX

panggilan sistem berikut dan fungsi POSIX diperlukan untuk tugas ini:

  • pipe(): Mencipta paip untuk komunikasi antara proses ibu bapa dan anak.
  • fork(): Mencipta anak baharu proses.
  • dup2(): Menduakan deskriptor fail kepada deskriptor lain.
  • execve(): Melaksanakan imej atur cara baharu dalam proses semasa.
  • write(): Menulis data kepada deskriptor fail.
  • read(): Membaca data daripada deskriptor fail.

Pelaksanaan Fungsi

Fungsi di bawah ikuti langkah-langkah ini untuk melaksanakan proses anak dengan I/O standard paip:

  1. Buat dua paip, satu untuk input standard dan satu untuk output standard.
  2. Buat proses anak baharu.
  3. Dalam proses anak:

    • Ubah hala input standardnya ke hujung baca paip input.
    • Ubah hala output standard dan ralat standardnya ke hujung tulis paip output.
    • Tutup semua deskriptor fail yang tidak digunakan yang diwarisi daripada induk.
    • Laksanakan program anak ("foo") menggunakan execve().
  4. Dalam proses induk:

    • Tutup hujung paip yang tidak digunakan.
    • Tulis rentetan input ke hujung tulis paip input.
    • Baca dan simpan output standard kanak-kanak daripada hujung baca paip output.
    • Tunggu proses kanak-kanak selesai menggunakan garpu().
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

#define PIPE_READ 0
#define PIPE_WRITE 1

string f(string s) {
  int inputPipe[2];
  int outputPipe[2];
  pid_t childPid;
  char c;
  string result;

  if (pipe(inputPipe) < 0 || pipe(outputPipe) < 0) {
    perror("Error creating pipes");
    return "";
  }

  if ((childPid = fork()) == -1) {
    perror("Error creating child process");
    return "";
  } else if (childPid == 0) {  // Child process
    // Redirect standard input
    if (dup2(inputPipe[PIPE_READ], STDIN_FILENO) < 0) {
      perror("Error redirecting standard input");
      exit(errno);
    }

    // Redirect standard output and standard error
    if (dup2(outputPipe[PIPE_WRITE], STDOUT_FILENO) < 0) {
      perror("Error redirecting standard output");
      exit(errno);
    }
    if (dup2(outputPipe[PIPE_WRITE], STDERR_FILENO) < 0) {
      perror("Error redirecting standard error");
      exit(errno);
    }

    // Close unused pipes
    close(inputPipe[PIPE_READ]);
    close(inputPipe[PIPE_WRITE]);
    close(outputPipe[PIPE_READ]);

    // Execute child process
    execl("/bin/sh", "sh", "-c", s.c_str(), NULL);
    perror("Error executing child process");
    exit(errno);
  } else {  // Parent process
    // Close unused pipes
    close(inputPipe[PIPE_READ]);
    close(outputPipe[PIPE_WRITE]);

    // Write input string to child's standard input
    write(inputPipe[PIPE_WRITE], s.c_str(), s.size());

    // Read output from child's standard output
    while (read(outputPipe[PIPE_READ], &c, 1) > 0) {
      result += c;
    }

    // Close pipes
    close(inputPipe[PIPE_WRITE]);
    close(outputPipe[PIPE_READ]);

    // Wait for child to finish
    waitpid(childPid, NULL, 0);
  }

  return result;
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Proses Kanak-kanak dengan Piped Standard I/O dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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