Я пытаюсь создать похожий на оболочку конвейер в 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?