C 프로그램에서 STDOUT을 STDIN으로 리디렉션하는 방법

C 프로그램에서 STDOUT을 STDIN으로 리디렉션하는 방법

다음과 같은 명령을 실행하는 C 프로그램을 작성한다고 가정해 보겠습니다.ls -l | wc -l

시도는 다음과 같습니다.

int main(){
    int fd;
    char *buffer[] = {"ls", "-l", (char *) NULL};
    char *buffer1[] = {"wc", "-l",(char *) NULL};
    if(fork() == 0){
        // I make the STDOUT_FILENO and fd equivalent
        if((fd = dup(STDOUT_FILENO)) == -1){
            perror("error");
            exit(EXIT_FAILURE);
        }
        close(fd);
        if(fork() == 0)
            execvp(buffer[0], buffer);
        // then I make fd and STDIN_FILENO equivalent in order to put the output of the previous command
        // as the input of the second command
        if(dup2(fd, STDIN_FILENO) == -1){
            perror("error");
            exit(EXIT_FAILURE);
        }
        execvp(buffer1[0], buffer1);
    }

    exit(EXIT_SUCCESS);
}

ls -l하지만 출력을 공급하지 않고 실행됩니다 .wc -l

답변1

두 프로세스 사이에 파이프를 만들어야 합니다. ( |명령줄에서 사용할 때도 마찬가지입니다.)

이를 수행하는 방법에 대한 많은 예가 있습니다.여기.

기본적으로 호출을 통해 파이프를 생성한 pipe()다음 각 프로세스가 파이프의 한쪽 끝을 닫습니다.

관련 정보