Соединение n команд с конвейерами в оболочке?

Я пытаюсь реализовать оболочку на C. Я могу отлично выполнять простые команды с простой execvp (), но одним из требований является управление такими командами: «ls -l | head | tail -4» с циклом for и только одним оператором pipe (), перенаправляющим stdin и stdout. Теперь, по прошествии нескольких дней, я немного потерялся.

N = Количество простых команд (3 в примере: ls, head, tail) commands = список структур с командами, например:

commands[0].argv[0]: ls
commands[0].argv[1]: -l
commands[1].argv[0]: head
commands[2].argv[0]: tail
commands[2].argv[1]: -4

Итак, я создал цикл for, и начал перенаправлять stdin и stdout, чтобы соединить все команды с каналами, но ... Я просто не понимаю, почему это не работает.

for (i=0; i < n; i++){

pipe(pipe);
if(fork()==0){  // CHILD

    close(pipe[0]);
    close(1);
    dup(pipe[1]);
    close(pipe[1]);

    execvp(commands[i].argv[0], &commands[i].argv[0]);
    perror("ERROR: ");
    exit(-1);

}else{      // FATHER

    close(pipe[1]);
    close(0);
    dup(pipe[0]);
    close(pipe[0]);

}
}

Я хочу создать «строку» дочерних процессов:

[ls -l] ---- pipe ----> [head] ---- pipe ----> [tail -4]

Все эти процессы имеют корень (процесс, выполняющий мою оболочку), поэтому первый отец также является потомком процесс оболочки, я уже немного измотан, может ли кто-нибудь мне помочь, пожалуйста?

Я даже не уверен, должны ли дочерние элементы выполнять команды.

Спасибо, ребята !!

25
задан user1031296 10 November 2011 в 16:33
поделиться