>백엔드 개발 >C++ >Linux에서 파이프된 Stdin/Stdout을 사용하여 하위 프로세스를 실행하는 방법은 무엇입니까?

Linux에서 파이프된 Stdin/Stdout을 사용하여 하위 프로세스를 실행하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-09 03:52:02709검색

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

Linux에서 파이프된 Stdin/Stdout을 사용하여 하위 프로세스 실행

Linux에서 Pipedstdin/stdout을 사용하여 하위 프로세스를 실행하려면 다음의 조합이 필요합니다. Linux syscall 또는 POSIX 함수. 이를 달성하기 위해 다음 기술을 활용합니다.

  1. 파이프 생성(파이프 syscall): 단방향 프로세스 간 통신 채널을 생성하여 상위 프로세스와 하위 프로세스 간의 데이터 교환을 허용합니다.
  2. 파일 설명자 복제(dup2 syscall): 기존 파일을 복제합니다. 입력 또는 출력 스트림을 리디렉션하는 데 사용되는 파일 설명자.
  3. fork 및 exec(fork execve syscalls): 지정된 명령(이 경우 "foo")을 실행하는 새 하위 프로세스를 생성합니다. ).
  4. 파일 설명자 관리: 방지하기 위해 사용하지 않는 파일 설명자를 닫습니다. 오류를 방지하고 올바른 리소스 처리를 보장합니다.

다음은 이러한 기술을 구현하는 C 예입니다.

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

이 코드 조각:

  • 파이프를 생성합니다. 파이프를 사용하여 stdin 및 stdout에 사용됩니다.
  • 파이프를 사용하여 하위 프로세스를 포크합니다. fork.
  • 하위 프로세스에서는 dup2를 사용하여 stdin 및 stdout을 파이프로 리디렉션한 다음 execlp를 사용하여 파이프된 stdin으로 "foo"를 실행합니다.
  • 상위 프로세스에서는 사용하지 않는 파일 설명자를 닫습니다. , stdin 파이프에 쓰고 stdout 파이프에서 읽어 출력을 캡처합니다.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.