Linux에서 파이프된 Stdin 및 Stdout을 사용하여 하위 프로세스 실행
Linux에서 파이프된 표준 입력(stdin)을 사용하여 하위 프로세스를 실행해야 하는 작업 ) 및 표준 출력(stdout)은 다양한 syscall 또는 POSIX 기능을 통해 수행될 수 있습니다. 특히 Linux 3.0 이상의 경우 Pipe(), fork(), execve() 및 dup2()를 사용하는 것이 좋습니다.
솔루션 개요
만들기 파이프:
포크 프로세스:
하위 프로세스의 IO 리디렉션:
사용하지 않는 파이프 닫기:
하위 실행:
IO 통신:
구현
다음 C 코드는 이 솔루션을 보여줍니다.
#include <iostream> #include <cstdlib> #include <cstring> #include <unistd.h> #include <fcntl.h> using namespace std; int main() { int aStdinPipe[2], aStdoutPipe[2]; pid_t childPid; char buffer[1024]; const char* command = "foo"; string input = "Hello World!"; // Create pipes if (pipe(aStdinPipe) == -1 || pipe(aStdoutPipe) == -1) { cerr << "Error creating pipes." << endl; return EXIT_FAILURE; } // Fork child process childPid = fork(); if (childPid == -1) { cerr << "Error creating child process." << endl; return EXIT_FAILURE; } // Redirect IO in child process if (childPid == 0) { // Child process if (dup2(aStdinPipe[PIPE_READ], STDIN_FILENO) == -1 || dup2(aStdoutPipe[PIPE_WRITE], STDOUT_FILENO) == -1 || dup2(aStdoutPipe[PIPE_WRITE], STDERR_FILENO) == -1) { cerr << "Error redirecting IO in child." << endl; return EXIT_FAILURE; } // Close unused pipes close(aStdinPipe[PIPE_READ]); close(aStdinPipe[PIPE_WRITE]); close(aStdoutPipe[PIPE_WRITE]); // Execute command execve(command, NULL, NULL); } // Close unused pipes in parent process close(aStdinPipe[PIPE_READ]); close(aStdoutPipe[PIPE_WRITE]); // Write input to child process write(aStdinPipe[PIPE_WRITE], input.c_str(), input.length()); // Read output from child process int numBytesRead = 0; while ((numBytesRead = read(aStdoutPipe[PIPE_READ], buffer, sizeof(buffer))) > 0) { cout.write(buffer, numBytesRead); } // Close remaining pipes close(aStdinPipe[PIPE_WRITE]); close(aStdoutPipe[PIPE_READ]); return EXIT_SUCCESS; }
이 코드는 입력 문자열을 사용하여 foo 명령을 실행합니다. 입력하면 foo의 출력이 콘솔에 인쇄됩니다.
위 내용은 Linux에서 파이프된 Stdin 및 Stdout을 사용하여 하위 프로세스를 실행하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!