파이프를 통해 표준 I/O 매개변수를 하위 프로세스에 전달
목표는 하위 프로세스(" foo")를 표준 입력("s")으로 사용하고 자식의 표준 출력을 문자열 변수로 반환합니다.
시스템 호출 및 POSIX 함수
이 작업에는 다음 시스템 호출과 POSIX 함수가 필요합니다.
함수 구현
아래 함수 파이프된 표준 I/O를 사용하여 하위 프로세스를 실행하려면 다음 단계를 따르세요.
하위 프로세스에서:
상위 프로세스에서:
#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 중국어 웹사이트의 기타 관련 기사를 참조하세요!