Я хотел бы использовать каналы для перенаправления стандартного ввода и вывода дочернего процесса.
В настоящий момент у меня есть следующий код:
void child(int pipeIn[], int pipeOut[]) {
char buff[20];
const char msg[]="Child Message\n";
close(pipeIn[1]);
close(pipeOut[0]);
if (dup2(pipeIn[0], 0))
perror("dup2 pipeIn");
if (dup2(pipeOut[1], 1))
perror("dup2 pipeOut");
close(pipeIn[0]);
close(pipeOut[1]);
for (int i = 0; i < 10; ++i) {
read(0, buff, 20);
fprintf(stderr, "Child: %s\n",buff);
printf("%s",msg);
}
}
void parent(int pipeIn[], int pipeOut[]) {
char buff[20];
const char msg[]="Parent Message\n";
close(pipeIn[0]);
close(pipeOut[1]);
for (int i = 0; i < 10; ++i) {
write(pipeIn[1], msg, 16);
read(pipeOut[0], buff, 50);
printf("Parent: %s", buff);
}
}
void test() {
int pipeOut[2],pipeIn[2];
if(pipe(pipeOut)) {
perror("pipeOut");
exit(1);
}
if(pipe(pipeIn)) {
perror("pipeIn");
exit(1);
}
int pid = fork();
if (pid == -1) {
perror("fork()");
exit(1);
}
else if (pid == 0)
child(pipeIn, pipeOut);
else
parent(pipeIn,pipeOut);
}
Однако этот код не являетсяработает, потому что я продолжаю получать
dup2 pipeOut: неопределенная ошибка: 0
И это заканчивается тупиком.
Я понимаю, что код останавливается, потому что родитель сохраняетожидание ответа ребенка (который никогда не приходит), и то же самое ребенок продолжает ждать ввода, который никогда не приходит.
То, что я не понимаю, почему я продолжаю получать эту ошибку.Я делаю что-то неправильно?
Я работаю над MacOS Lion 10.7.2 и Xcode 4.2.1.
ОБНОВЛЕНИЕ: после ответа Адама Розенфилда я исправил свое утверждение if.Однако код все еще останавливается, как я уже сказал (я могу прочитать только первое, что печатает ребенок Child: Parent Message
и ничего больше).
Есть идеи, почему это происходит?