I'm actually trying to implement a basic minishell in C. For doing that, I made a fonction which parse what the user enter in the console. I parsed it and then I would like to send the command to the console using pipes. I don't understand why my pipes are not working. I checked the parsing and it seems to be fine, i have the right commands in parameters of the fonction. The thing is that my pipe code is literally doing nothing and I don't understand why. Here is my code. Thank you in advance.
#define READ 0
#define WRITE 1
char *cmds[5] = {0};
int main() {    
    char *saisie = (char*)malloc(100*sizeof(char*));
    char *saisie2 = (char*)malloc(100*sizeof(char*));
    gets(saisie);
    int ncmds = 0;
    int k = 0;
    char* token = (char*)malloc(100*sizeof(char*));
    char* tofree;
    if(*(saisie + 0) == '$'){
        if(*(saisie + 2) == 'e' && *(saisie + 3) == 'x' && *(saisie + 4) == 'i' || *(saisie + 5) == 't'){
            exit(0);
        }
        else{
            int i;
            for(i = 0;i<99;i++){
                *(saisie2+i) = *(saisie+i+1);
            }       
            free(saisie);
            if (saisie2 != NULL) {
                tofree = saisie2;
                while ((token = strsep(&saisie2, "|")) != NULL){
                     cmds[ncmds] = token;
                     ncmds++;
                }
                free(tofree);           
            }
        }
    }
    exe(cmds, ncmds);   
    while(wait(NULL) > 0);
    return 0;
}
int exe(char *cmds[], int ncmds){
    int fdin, fdout;
int fds[2];
int i;
int status;
fdin = 0;
for(i=0; i < ncmds-1; i++){
    pipe(fds);
    fdout = fds[WRITE];
    if(fork() == 0){
        if( fdin != 0 ) {
            close(0);
            dup(fdin); 
            close(fdin);
        }
        if( fdout != 1 ) {
            close(1);
            dup(fdout); 
            close(fdout);
        }
        close(fds[READ]);
        const char* prog2[] = {cmds[i], "-l", 0};
        execvp(cmds[i], prog2);
        fprintf(stderr, "si esto se ve es un error\n");
        exit(1);
    }
    if(fdin != 0)
        close(fdin);
    if(fdout != 1)
        close(fdout);
    fdin = fds[READ];
}
/* Ultimo comando */
fdout = 1;
if(fork() == 0) {
    if( fdin != 0 ) {
        close(0); 
        dup(fdin); 
        close(fdin);
    }
    const char* prog2[] = {cmds[i], "-l", 0};
    execvp(cmds[i], prog2);
    close(fds[READ]);
    exit(1);
}
if(fdout!= 1)
    close(fdout);
if(fdin != 0)
    close(fdin);
    }
}
 
    