Я хочу понять, как работает pipe, но я не понимаю, почему waitpid блокируется, если вы запускаете мою программу с помощью "ls -l / usr / bin", "grep ls" .... Если вы вынулиВариант -l это работает!my_str_tab просто помещает каждое слово строки в массив charstar.
void command_levels(int *pipe_fd, char **av, int idx, int pipe_save, int pipe_one)
{
if (idx == 1)
dup2(pipe_fd[1], 1);
else if (idx > 1 && av[idx + 1] != NULL) {
dup2(pipe_save, 0);
dup2(pipe_fd[1], 1);
}
if (idx > 1 && av[idx + 1] == NULL) {
dup2(pipe_save, 0);
dup2(pipe_one, 1);
}
}
void multiple_pipe_handle(char **av, char **env, int idx, int pipe_one)
{
int pipe_fd[2] = {0, 0};
char **command = NULL;
static int pipe_save = 0;
if (av[idx] == NULL)
return;
command = my_str_tab(av[idx], " ");
pipe(pipe_fd);
command_levels(pipe_fd, av, idx, pipe_save, pipe_one);
if (fork() == 0) {
close(pipe_fd[0]);
close(pipe_fd[1]);
execve(command[0], command, env);
} else {
wait(NULL);
close(pipe_fd[1]);
pipe_save = pipe_fd[0];
multiple_pipe_handle(av, env, idx + 1, pipe_one);
close(pipe_fd[0]);
}
}
int main(int ac, char **av, char **env)
{
int pipe_one = dup(1);
multiple_pipe_handle(av, env, 1, pipe_one);
}
Я ожидаю, что вывод всего слова содержит 'ls', но я нахожусь в бесконечном цикле ..