Как это должно работать: родитель создает дочерний элемент, который выполняет первую команду и перенаправляет вывод в канал, а затем второй ребенок перенаправляет стандартный вход в этот канал.
Моя проблема: когда второй ребенок пытается читать из трубы, он ждет навсегда
(Мне действительно нужна петля здесь, потому что в моей реальной программе я не буду знать, сколько команд у меня будет, так что это просто версия)Трубы не работают в петле с вилками
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>
int main(int argc, char**argv) {
int fd[2];
pipe(fd);
for(int i = 0; i < 2; i++) {
if (fork() == 0) {
printf("\nloop %d\n", i);
if (i == 0) {
dup2(fd[1], 1);
close(fd[0]);
close(fd[1]);
printf("\nbefore exec %s\n", argv[1]);
execlp(argv[1], argv[1], NULL);
}
else if(i == 1) {
dup2(fd[0], 0);
close(fd[0]);
close(fd[1]);
printf("\nbefore exec %s\n", argv[2]);
execlp(argv[2], argv[2], NULL);
}
exit(0);
}
wait(NULL);
}
return(0);
}
Если вы проверите возвращаемые значения своих вызовов функций, как вы должны это сделать, вы узнаете, где произошел сбой, если действительно существует какой-либо фактический сбой вообще. –
Первый ребенок умирает после «dup2 (fd [1], 1)», но я не понимаю, почему .. –
Что такое возвращаемое значение от 'dup2'? – Tim