Мы пытаемся реализовать нашу пользовательскую оболочку на C с использованием системных вызовов.Когда мы пытаемся добавить функцию системы трубопроводов, программа сразу завершает работу после печати операции конвейера. Трубопровод работает так, как должно быть.Но обычно наша оболочка никогда не завершается после ввода обычными командами.Вот наш код для трубопровода:
while(1){
if (childpid == 0) {
dup2(pipefd[1], 1);
close(pipefd[1]);
execvp(pipeInput(args,counter)[0], pipeInput(args, counter);
exit(0);
} else if(childpid >0){
dup2(pipefd[0], 0);
close(pipefd[0]);
close(pipefd[1]);
wait(NULL);
execvp(pipeOutput(args,counter)[0], pipeOutput(args, counter);
}
}
pipeInput
и pipeOutput
методы группируют аргументы до и после |знак.Они работают правильно.args
содержит все аргументы в этой итерации.Это не полный код, но я думаю, что этой части будет достаточно.Я попытался fork новый дочерний элемент в верхнем дочернем элементе и использовать верхний дочерний элемент в качестве родительского дочернего элемента, отправив на него выходные данные.Это тоже работает один раз, и цикл переходит к следующей итерации.Во второй итерации, когда я пытаюсь напечатать ls | sort
, он напрямую печатает ls и зависает там.