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.