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