Рекурсивный конвейер в c - PullRequest
       7

Рекурсивный конвейер в c

0 голосов
/ 16 сентября 2018

Я пытаюсь создать похожий на оболочку конвейер в c, я создал функцию для настройки каналов, fork и exec:

void pipework(char **commands, int *fds)
{
    if (!*commands) {
        close(fds[0]);
        close(fds[1]);
        exit(1);
    }
    close(fds[1]);
    dup2(fds[0], 0);
    pipe(fds);
    pid_t pid = fork();
    if (pid == 0) {
        pipework(commands+1, fds);
    }
    close(fds[0]);
    dup2(fds[1], 1);
    execute(tokenise(*commands, " "));
}

Вызывается по:

int fds[2];
pipe(fds);
pid_t pid = fork();
if (pid == 0) {
    pipework(commands, fds);
}
close(fds[0]);
waitpid(pid, NULL, 0);

Но это приводит к ошибке Broken pipe в последней команде.Вероятно, из-за базового случая:

if (!*commands) {
    close(fds[0]);
    close(fds[1]);
    exit(1);
}

Каков правильный базовый случай для конвейера, чтобы последняя команда выводила в STDOUT?

...