Я создал минимальный воспроизводимый пример своей программы, и он работает точно так же.
Код: Выделить всё
#include
#include
#include
void execute_block(char **block)
{
int pid;
pid = fork();
if (pid == -1)
exit(EXIT_FAILURE);
if (pid == 0)
{
if (execve(block[0], block, NULL) == -1)
{
perror(block[0]);
exit(127);
}
exit(EXIT_SUCCESS);
}
waitpid(pid, NULL, 0);
}
void handle_commands(char **block1, char **block2)
{
int pid;
int pipefd[2];
if (pipe(pipefd) == -1)
exit(EXIT_FAILURE);
pid = fork();
if (pid == -1)
exit(EXIT_FAILURE);
if (pid == 0)
{
close(pipefd[0]);
dup2(pipefd[1], STDOUT_FILENO);
close(pipefd[1]);
execute_block(block1);
exit(EXIT_SUCCESS);
}
close(pipefd[1]);
dup2(pipefd[0], STDIN_FILENO);
close(pipefd[0]);
waitpid(pid, NULL, 0);
execute_block(block2);
}
int main(int argc, char **argv, char **envp)
{
char *block1[] = {"/bin/cat", NULL};
char *block2[] = {"/bin/ls", NULL};
handle_commands(block1, block2);
}
Подробнее здесь: https://stackoverflow.com/questions/781 ... ls-command
Мобильная версия