We are in the middle of grading Lab 8. In the mean time, take a look at one possible solution below:
int main() { // code removed for brevity : : } else { // loop through each commands, setup pipes. int i; int fd[2*MAX_PIPE_LENGTH]; for (i = 0; i < num_of_cmds; i++) { // for k cmds, there should be k-1 pipes. // the ith cmd reads from fd[2i-2], write to fd[2i+1]. if (i < num_of_cmds - 1) { pipe(&fd[2*i]); } pid = fork(); int read_from = (i<<1)-2; int write_to = (i<<1)+1; switch (pid) { case -1: perror("fork"); exit(1); case 0: if (i != 0) { if (dup2(fd[read_from], STDIN_FILENO) == -1) perror("dup2"); close(fd[read_from+1]); } if (i != num_of_cmds-1) { if (dup2(fd[write_to], STDOUT_FILENO) == -1) perror("dup2"); close(fd[write_to-1]); } execvp(args[i][0], args[i]); perror(args[i][0]); close(fd[read_from]); close(fd[write_to]); exit(1); default: if (i > 0) { if (close(fd[2*i-2]) == -1) { perror("close"); } if (close(fd[2*i-1]) == -1) { perror("close"); } } break; } } for (i = 0; i < num_of_cmds; i++) waitpid(-1, NULL, 0); } free(command); } return 0; }