Rumah  >  Artikel  >  pembangunan bahagian belakang  >  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
Mary-Kate Olsenasal
2024-11-10 14:08:02625semak imbas

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

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:
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