Chcę napisać program odpalany ./main -pls -pcat -pwc który będzie uruchamiał kolejne programy z listy, np. ls | cat | wc, oraz łączył je pipe'ami.

#define _GNU_SOURCE
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.h>

#define MAX_PROCESSES 10
#define READ_END 0
#define WRITE_END 1
#define CHILD 0
extern char *optarg;

int main(int argc, char *argv[]) {
    int processNumber = 0, i, j, opt, PID;
    int pipeDes[MAX_PROCESSES-1][2];
    char optargs[MAX_PROCESSES][32];

    while(-1 != (opt = getopt(argc, argv, "p:"))) {
        switch(opt) {
            case 'p':
                strcpy(optargs[processNumber++], optarg);
                break;
        }
    }
    for(i = 0; i < processNumber-1; ++i) {
        if(pipe(pipeDes[i]) < 0) {
            perror("Creating pipe failed.");
            return(EXIT_FAILURE);
        }
    }
    for(i = 0; i < processNumber; ++i) {
        PID = fork();
        if(-1 == PID) {
            perror("Fork failed.");
            return(EXIT_FAILURE);
        } else if(CHILD == PID) {
            if(0 != i) {
                dup2(pipeDes[i-1][READ_END], STDIN_FILENO);
            }
            if((processNumber-1) != i) {
                dup2(pipeDes[i][WRITE_END], STDOUT_FILENO);
            }
            execl(optargs[i], NULL);
        }
    }
    for(i = 0; i < processNumber; ++i) {
        wait(NULL);
    }
    return(EXIT_SUCCESS);
}

Wizualnie widzę to tak:ls [----pipeDes[0]----] cat [----pipeDes[1]----] wc Zastępuję wyjście ls z zapisem pipeDes[0], wejście cat z odczytem pipeDes[0], wyjście cat z zapisem pipeDes[1], wejście wc z odczytem pipeDes[1].
Program niestety kończy się bez widocznego efektu, a nie mogę sobie poradzić z debugowaniem. Co jest źle? Dodawałem zamykanie nieużywanych końców pipe'ów, ale to nic nie zmieniało i nie wiem czy to konieczne.