Я пишу код С, который включает в себя использование труб. Для того, чтобы процесс ребенка использовать трубку вместо STDOUT для вывода, я использовал следующие строки:C закрыть STDOUT работает навсегда
close(STDOUT);
dup2(leftup[1], STDOUT);
Тем не менее, кажется, идти в какой-то бесконечный цикл или повесить на этих линиях. Когда я избавлюсь от close
, он висит на dup2
.
Любопытно, что та же самая идея работает непосредственно предшествующая линия для STDIN:
close(STDIN);
dup2(leftdown[0], STDIN);
Что может быть причина такого поведения?
Edit: Просто чтобы быть ясно ...
#define STDIN 0
#define STDOUT 1
Edit 2: Вот урезанный пример:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#define STDIN 0
#define STDOUT 1
main(){
pid_t child1 = 0;
int leftdown[2];
if (pipe(leftdown) != 0)
printf("ERROR");
int leftup[2];
if (pipe(leftup) != 0)
printf("ERROR");
printf("MADE PIPES");
child1 = fork();
if (child1 == 0){
close(STDOUT);
printf("TEST 1");
dup2(leftup[1], STDOUT);
printf("TEST 2");
exit(0);
}
return(0);
}
"TEST 1"
линия никогда не достигается. Единственный выход - "MADE PIPES"
.
Чтобы быть еще четче: есть уже «STDIN_FILENO» и др. Не изобретайте велосипед. – 2013-02-10 06:27:45