Я пытаюсь разветвить, а затем выполнить две или более команд в дочернем процессе. Моя идея состоит в том, чтобы использовать цикл while для непрерывного разветвления и выполнения команды в одном процессе, продолжая цикл в другом. Вот мой код:
void
execute_pipe_command(command_t *c)
{
command_t command = *c;
pid_t pid = fork();
if(pid > 0) {
int status;
while(waitpid(pid, &status, 0) < 0)
continue;
if(!WIFEXITED(status))
error(1, errno, "Child exit error");
command->status = WEXITSTATUS(status);
return;
} else if (pid == 0) {
while(command->type == PIPE_COMMAND)
{
int fd[2]; pipe(fd);
pid = fork();
if(pid > 0) {
close(fd[0]);
dup2(fd[1], STDOUT_FILENO);
char **args = command->u.command[1]->u.word;
execvp(args[0], args);
} else if (pid == 0) {
close(fd[1]);
dup2(fd[0], STDIN_FILENO);
command = command->u.command[0];
continue;
} else {
error(1, errno, "forking error");
}
}
char **args = command->u.word;
execvp(args[0], args);
} else {
error(1, errno, "forking error");
}
}
Команда — это структура, которая содержит свой тип, и если это команда конвейера, она содержит левую и правую дочерние команды. В противном случае, если это простая команда, она содержит массив строк, составляющих команду.
Когда я вызываю эту функцию с помощью команды конвейера, такой как ls | cat, она должна выполнять команды, но вместо этого ведет себя странно. Первые две переданные команды будут выполняться, но не вернут управление программе. Вместо этого он будет висеть. Последующие команды просто игнорируются. Итак, если я передам это ls | cat | wc, эта функция напечатает ls и не завершится, пока я не передам SIGINT.
Я довольно сильно запутался в том, что происходит. Буду признателен, если кто-нибудь укажет на проблему.