gitme
198
2019-12-21 19:00:00
3
817

리눅스 다중 파이프 구현 질문입니다.


리눅스에서 ls | wc | wc 를 처리할 수 있는 파이프를 만들려고하는데요

파이프 하나는 구현했는데 두 개 이상은 어떻게 해야하나요?


pipe 1개 같은 경우는 pipe를 생성한 후 

fork() 이후 

자식 프로세스에서 dup2(fd[1],1);

부모 프로세스에서 dup2(fd[0],0); 

이렇게 연결 해서 구현했는데 ls | wc | wc 를 처리하기 위해서는 fd2라는 파이프를 하나 더 만들어서 잘

연결하면 되나요?


혼자 해보다가 도저히 안돼서 질문드립니다 ㅠㅠ


0
0
  • 답변 3

  • 엡실론
    1k
    2019-12-22 01:04:51

    일단 프로세스가 3개가 되어야 되고, 파이프는 2개를 만들고, 하셨던걸 반복해서 적용하면 됩니다.

    1
  • esrse
    723
    2019-12-23 16:27:33

    재밌어보여서 한번 작성해봤습니다.

    공부하시면서 참고하세요.

    #include <sys/types.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    
    #define STDIN_PIPE 0x1
    #define STDOUT_PIPE 0x2
    
    
    void exec_command(char *command, int pipefd[2], int flags) {
            pid_t cpid = fork();
            if (cpid > 0)
                    return;
            else if (cpid < 0)
                    perror("fork");
    
            if (flags & STDIN_PIPE)
                    if (dup2(pipefd[0], STDIN_FILENO) < 0)
                            perror("dup2");
    
            if (flags & STDOUT_PIPE)
                    if (dup2(pipefd[1], STDOUT_FILENO) < 0)
                            perror("dup2");
    
            close(pipefd[0]);
            close(pipefd[1]);
    
            char *const argv[] = {command, NULL};
            char *const envp[] = {NULL};
            execve(command, argv, envp);
            perror("execv");
    }
    
    
    int main() {
            int pipefd1[2], pipefd2[2];
            pipe(pipefd1);
            pipe(pipefd2);
    
            exec_command("/bin/ls", pipefd1, STDOUT_PIPE);
            close(pipefd1[1]);
            exec_command("/usr/bin/wc", pipefd2, STDIN_PIPE);
            close(pipefd2[0]);
    
            int temp_pipefd[] = {pipefd1[0], pipefd2[1]};
            exec_command("/usr/bin/wc", temp_pipefd, STDIN_PIPE | STDOUT_PIPE);
    
            close(pipefd1[0]);
            close(pipefd2[1]);
    
            int wstatus;
            while (wait(&wstatus) > 0);
    
            return 0;
    }
    


    1
  • gitme
    198
    2019-12-28 16:48:17

    감사합니다!!

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.