Я пытаюсь реализовать оболочку на 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]
Все эти процессы имеют корень (процесс, выполняющий мою оболочку), поэтому первый отец также является потомком процесс оболочки, я уже немного измотан, может ли кто-нибудь мне помочь, пожалуйста?
Я даже не уверен, должны ли дочерние элементы выполнять команды.
Спасибо, ребята !!