Pipes y stdout/stdin
Publicado por Javi (1 intervención) el 24/10/2007 17:05:57
Necesito crear 2 pipes para poder comunicar 3 comandos, la salida del primer comandoo a la entrada del segundo y a su vez esta salida a la entrada del ultimo,
Al hacerlo para 2 procesos, anda bien, pero cuando agrego el código para correr el ultimo comando (proceso padre) se queda esperando la stdin.
Supongo que tiene que ver que estoy redireccionando la stdout dos veces.. Alguna idea?
Gracias,
int main(int argc, char *argv[])
{
int firstPipe[2];
int secondPipe[2];
int ilStdinOriginal=dup(STDIN_FILENO);
int ilSrdoutOriginal=dup(STDOUT_FILENO);
if (pipe(firstPipe) < 0)
{
return -1;
}
if (pipe(secondPipe) < 0)
{
return -1;
}
if (0==fork())
{
// Child 1
close(firstPipe[0]);
close(secondPipe[1]);
dup2(firstPipe[1],STDOUT_FILENO);
close(firstPipe[1]);
if (system("ls -lai")==-1)
{
// Restore stdout
dup2(ilSrdoutOriginal,STDOUT_FILENO);
printf("Unable to run command );
exit(-1);
}
} else {
if (0==fork())
{
// Child 2
close(firstPipe[1]);
close(secondPipe[0]);
dup2(firstPipe[0],STDIN_FILENO);
close(firstPipe[0]);
close(secondPipe[0]);
dup2(secondPipe[1],STDOUT_FILENO);
close(secondPipe[1]);
if (system("grep 12")==-1)
{
// Restore stdout
dup2(ilSrdoutOriginal,STDOUT_FILENO);
printf("Unable to run command );
exit(-1);
}
} else {
// Father
close(secondPipe[1]);
dup2(secondPipe[0],STDIN_FILENO);
close(secondPipe[0]);
if (system("wc")==-1)
{
// Restore stdout
dup2(ilSrdoutOriginal,STDOUT_FILENO);
printf("Unable to run command );
exit(-1);
}
}
}
}
}
Al hacerlo para 2 procesos, anda bien, pero cuando agrego el código para correr el ultimo comando (proceso padre) se queda esperando la stdin.
Supongo que tiene que ver que estoy redireccionando la stdout dos veces.. Alguna idea?
Gracias,
int main(int argc, char *argv[])
{
int firstPipe[2];
int secondPipe[2];
int ilStdinOriginal=dup(STDIN_FILENO);
int ilSrdoutOriginal=dup(STDOUT_FILENO);
if (pipe(firstPipe) < 0)
{
return -1;
}
if (pipe(secondPipe) < 0)
{
return -1;
}
if (0==fork())
{
// Child 1
close(firstPipe[0]);
close(secondPipe[1]);
dup2(firstPipe[1],STDOUT_FILENO);
close(firstPipe[1]);
if (system("ls -lai")==-1)
{
// Restore stdout
dup2(ilSrdoutOriginal,STDOUT_FILENO);
printf("Unable to run command );
exit(-1);
}
} else {
if (0==fork())
{
// Child 2
close(firstPipe[1]);
close(secondPipe[0]);
dup2(firstPipe[0],STDIN_FILENO);
close(firstPipe[0]);
close(secondPipe[0]);
dup2(secondPipe[1],STDOUT_FILENO);
close(secondPipe[1]);
if (system("grep 12")==-1)
{
// Restore stdout
dup2(ilSrdoutOriginal,STDOUT_FILENO);
printf("Unable to run command );
exit(-1);
}
} else {
// Father
close(secondPipe[1]);
dup2(secondPipe[0],STDIN_FILENO);
close(secondPipe[0]);
if (system("wc")==-1)
{
// Restore stdout
dup2(ilSrdoutOriginal,STDOUT_FILENO);
printf("Unable to run command );
exit(-1);
}
}
}
}
}
Valora esta pregunta


0