(SIMULANDO UM SHELL LINUX EM C) Como implementar múltiplos pipes?

18/03/2019

4

Eu estou tentando simular um shell linux em C, ainda está no começo e funcionando para comandos sem pipes e somente um pipe. Eu tenho um vetor de comandos (
char ** com []
), que foram separados considerando o caractere "|", mas a minha pergunta é como proceder para mais de um pipe? Na implementação atual, estou tentando executar 3 comandos separados por pipes, mas não funciona:

int main(int argc, char **argv){

    if (argc == 1){
        return 0;
    }

    char **command = &argv[1];

    int *pipe_pos = get_pipe_pos(argc-1, command);
    //Vector with positions of pipes found, position 0 reserved for the total amount of commands.

    char **com[pipe_pos[0]]; //Commands vector
    get_commands(&*com);

    //EXECUTE COMMANDS
    pid_t fork1, fork2, fork3;
    int fd1[2], fd2[2];

    if(pipe(fd1) < 0){
        perror("pipe1");
    }
    if(pipe(fd2) < 0){
        perror("pipe2");
    }

    //COMMAND 1
    fork1 = fork();
    if(fork1 == 0){
        dup2(fd1[1], STDOUT_FILENO);
        execvp(com[0][0], com[0]);
    }else{
        waitpid(fork1, NULL, 0);
    }

    //COMMAND 2
    fork2 = fork();
    if(fork2 == 0){
        dup2(fd1[0], STDIN_FILENO);
        dup2(fd2[1], STDOUT_FILENO);
        execvp(com[1][0], com[1]);
    }else{
        waitpid(fork2, NULL, 0);
    }

    //COMMAND 3
    fork3 = fork();
    if(fork3 == 0){
        dup2(fd2[0], STDIN_FILENO);
        execvp(com[2][0], com[2]);
    }else{
        waitpid(fork3, NULL, 0);
    }

    return 0;
}
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira