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

Linux에서 표준 입력 및 출력을 하위 프로세스로 올바르게 파이프하려면 어떻게 해야 합니까?

Linda Hamilton
풀어 주다: 2024-11-08 19:39:02
원래의
225명이 탐색했습니다.

How can I properly pipe standard input and output to a child process in Linux?

Linux에서 파이프된 표준 입력 및 출력을 사용하여 하위 프로세스 실행

다음 함수를 고려하세요.

string f(string s) {
    string r = system("foo < s");
    return r;
}
로그인 후 복사

이것은 함수는 문자열 s를 표준 입력으로 사용하여 "foo" 프로그램을 실행하려고 시도하고 문자열 r에 프로그램의 표준 출력을 캡처합니다. 그러나 이 접근 방식은 실행 가능하지 않습니다.

이 기능을 올바르게 구현하려면 Linux 시스템 호출 또는 POSIX 함수의 조합이 필요합니다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int createChild(const char *szCommand, char *const aArguments[], char *const aEnvironment[],
               const char *szMessage) {
  int aStdinPipe[2];
  int aStdoutPipe[2];
  int nChild;
  char nChar;

  if (pipe(aStdinPipe) < 0) {
    perror("allocating pipe for child input redirect");
    return -1;
  }
  if (pipe(aStdoutPipe) < 0) {
    close(aStdinPipe[PIPE_READ]);
    close(aStdinPipe[PIPE_WRITE]);
    perror("allocating pipe for child output redirect");
    return -1;
  }

  nChild = fork();
  if (0 == nChild) {
    // child continues here

    // redirect stdin
    if (dup2(aStdinPipe[PIPE_READ], STDIN_FILENO) == -1) {
      exit(errno);
    }

    // redirect stdout
    if (dup2(aStdoutPipe[PIPE_WRITE], STDOUT_FILENO) == -1) {
      exit(errno);
    }

    // redirect stderr
    if (dup2(aStdoutPipe[PIPE_WRITE], STDERR_FILENO) == -1) {
      exit(errno);
    }

    // run child process image
    // (replace this with any `exec*` function you find easier to use)
    execve(szCommand, aArguments, aEnvironment);

    // if we get here at all, an error occurred, but we are in the child
    // process, so just exit
    exit(errno);
  } else if (nChild > 0) {
    // parent continues here

    // close unused file descriptors
    close(aStdinPipe[PIPE_READ]);
    close(aStdoutPipe[PIPE_WRITE]);

    // send message to child (if provided)
    if (NULL != szMessage) {
      write(aStdinPipe[PIPE_WRITE], szMessage, strlen(szMessage));
    }

    // read child's output
    while (read(aStdoutPipe[PIPE_READ], &nChar, 1) == 1) {
      write(STDOUT_FILENO, &nChar, 1);
    }

    // close pipes
    close(aStdinPipe[PIPE_WRITE]);
    close(aStdoutPipe[PIPE_READ]);
  } else {
    // failed to create child
    close(aStdinPipe[PIPE_READ]);
    close(aStdinPipe[PIPE_WRITE]);
    close(aStdoutPipe[PIPE_READ]);
    close(aStdoutPipe[PIPE_WRITE]);
  }
  return nChild;
}
로그인 후 복사

이 함수 createChild는 부모 및 자식 프로세스, 자식의 표준 입력 및 출력을 파이프로 리디렉션합니다. 그런 다음 상위 프로세스는 파이프를 통해 하위 프로세스에 입력을 보내고 동일한 파이프에서 하위 프로세스의 출력을 읽을 수 있습니다.

위 내용은 Linux에서 표준 입력 및 출력을 하위 프로세스로 올바르게 파이프하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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