После того, как пайпинг на моей оболочке c, программа напрямую завершает работу - PullRequest
0 голосов
/ 09 декабря 2018

Мы пытаемся реализовать нашу пользовательскую оболочку на 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 и зависает там.

...