Реализация оболочки в C и нужна помощь в обработке перенаправления ввода / вывода

Round 2

После прочтения некоторых ответов мой пересмотренный код выглядит так:

int pid = fork();

if (pid == -1) {
    perror("fork");
} else if (pid == 0) {   

    if (in) { //if '<' char was found in string inputted by user
        int fd0 = open(input, O_RDONLY, 0);
        dup2(fd0, STDIN_FILENO);
        close(fd0);
        in = 0;
    }

    if (out) { //if '>' was found in string inputted by user
        int fd1 = creat(output, 0644);
        dup2(fd1, STDOUT_FILENO);
        close(fd1);
        out = 0;
    }   

    execvp(res[0], res);
    perror("execvp");
    _exit(1);
} else {
    waitpid(pid, 0, 0);
    free(res);
}

Это работает, но, похоже, стандартный вывод не переподключен или что-то в этом роде. Вот исполнение:

SHELL$ cat > file
hello, world
this is a test
SHELL$ cat < file //no output
SHELL$ ls //no output

& APOS; & Lt; & APOS; и "& gt;" обе работают, но после того, как они выполнены, не выводится.

Round 1

Я некоторое время работал над относительно простой оболочкой в C, но у меня возникли проблемы с реализацией перенаправления ввода (& lt;) и вывода (& gt;). Помогите мне найти проблемы в следующем коде:

int fd;
int pid = fork();
int current_out;

if (in) { //if '<' char was found in string inputted by user
    fd = open(input, O_RDONLY, 0);
    dup2(fd, STDIN_FILENO);
    in = 0;
    current_out = dup(0);
}

if (out) { //if '>' was found in string inputted by user
    fd = creat(output, 0644);
    dup2(fd, STDOUT_FILENO);
    out = 0;
    current_out = dup(1);
}

if (pid == -1) {
    perror("fork");
} else if (pid == 0) {       
    execvp(res[0], res);
    perror("execvp");
    _exit(1);
} else {
    waitpid(pid, 0, 0);
    dup2(current_out, 1);
    free(res);
}

У меня может быть какой-то ненужный материал, потому что я пробовал разные вещи, чтобы заставить его работать. Я не уверен, что происходит не так.

Ответы на вопрос(3)

Ваш ответ на вопрос