> 백엔드 개발 > C++ > 본문

C에서 파이프된 표준 I/O를 사용하여 하위 프로세스를 실행하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-10 14:08:02
원래의
629명이 탐색했습니다.

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

파이프를 통해 표준 I/O 매개변수를 하위 프로세스에 전달

목표는 하위 프로세스(" foo")를 표준 입력("s")으로 사용하고 자식의 표준 출력을 문자열 변수로 반환합니다.

시스템 호출 및 POSIX 함수

이 작업에는 다음 시스템 호출과 POSIX 함수가 필요합니다.

  • pipe(): 상위 프로세스와 하위 프로세스 간의 통신을 위한 파이프를 생성합니다.
  • fork(): 새 하위 프로세스를 생성합니다. process.
  • dup2(): 파일 설명자를 다른 설명자로 복제합니다.
  • execve(): 현재 프로세스에서 새 프로그램 이미지를 실행합니다.
  • write(): 파일 설명자에 데이터를 씁니다.
  • read(): 파일 설명자에서 데이터를 읽습니다.

함수 구현

아래 함수 파이프된 표준 I/O를 사용하여 하위 프로세스를 실행하려면 다음 단계를 따르세요.

  1. 표준 입력용 파이프와 표준 출력용 파이프 두 개를 만듭니다.
  2. 새 하위 프로세스를 포크합니다.
  3. 하위 프로세스에서:

    • 표준 입력을 입력 파이프의 읽기 끝으로 리디렉션합니다.
    • 표준 출력 및 표준 오류를 다음으로 리디렉션합니다. 출력 파이프의 쓰기 끝.
    • 상위 프로그램에서 상속받은 사용하지 않는 모든 파일 설명자를 닫습니다.
    • execve()를 사용하여 하위 프로그램("foo")을 실행합니다.
  4. 상위 프로세스에서:

    • 사용하지 않는 파이프 끝을 닫습니다.
    • 입력 파이프의 쓰기 끝에 입력 문자열을 씁니다.
    • 출력 파이프의 읽기 끝에서 하위 프로세스의 표준 출력을 읽고 저장합니다.
    • fork()를 사용하여 하위 프로세스가 완료될 때까지 기다립니다.
#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;
}
로그인 후 복사

위 내용은 C에서 파이프된 표준 I/O를 사용하여 하위 프로세스를 실행하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿