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 중국어 웹사이트의 기타 관련 기사를 참조하세요!