pipes
Publicado por nuevo83 (1 intervención) el 07/09/2007 00:57:56
Hola,
tengo una duda sobre el uso del mecanismo Ipc PIPES, en concreto mi problema es que me estoy basando en unos apuntes que dicen: "Para que un proceso del pipe detecte el fin de fichero (EOF) todos los flujos de escritura(los dos, el del padre y el del hijo) en el pipe han de estar cerrados", y he consultado alguna pagina y dice que si que tienen que esetar cerrados los descriptores de escritura.
Pero lo he probado y con cerrar el flujo de escritura del padre me es suficiente.
Por ejemplo tengo este programa:
#include <unistd.h>
void main(void)
{
int fds[2];
pipe(fds);
if (fork() == 0) {
dup2(fds[0], 0);
close(fds[1]);
execlp("sort", "sort", 0);
}
else if ( fork() == 0) {
dup2(fds[1], 1);
close(fds[0]);
execlp("who", "who", 0);
}
else {
close(fds[0]);
close(fds[1]);
wait(0);
wait(0);
}
}
En este caso solo se me queda bloqueado si no hago close(fds[1]), porque vale no le llega el EOF al proceso que esta leyendo, pero si cierro el fds[1] en el padre y en el primer hijo no hago close(fds[1]) da lo mismo, el programa se ejecuta correctamente y supuestamente si no cierro el fds[1] del primer hijo el segundo hijo ya no deberia detectar el fin de fichero.
¿Alguien me puede explicar esto?
Muchas gracias,
Saludos
tengo una duda sobre el uso del mecanismo Ipc PIPES, en concreto mi problema es que me estoy basando en unos apuntes que dicen: "Para que un proceso del pipe detecte el fin de fichero (EOF) todos los flujos de escritura(los dos, el del padre y el del hijo) en el pipe han de estar cerrados", y he consultado alguna pagina y dice que si que tienen que esetar cerrados los descriptores de escritura.
Pero lo he probado y con cerrar el flujo de escritura del padre me es suficiente.
Por ejemplo tengo este programa:
#include <unistd.h>
void main(void)
{
int fds[2];
pipe(fds);
if (fork() == 0) {
dup2(fds[0], 0);
close(fds[1]);
execlp("sort", "sort", 0);
}
else if ( fork() == 0) {
dup2(fds[1], 1);
close(fds[0]);
execlp("who", "who", 0);
}
else {
close(fds[0]);
close(fds[1]);
wait(0);
wait(0);
}
}
En este caso solo se me queda bloqueado si no hago close(fds[1]), porque vale no le llega el EOF al proceso que esta leyendo, pero si cierro el fds[1] en el padre y en el primer hijo no hago close(fds[1]) da lo mismo, el programa se ejecuta correctamente y supuestamente si no cierro el fds[1] del primer hijo el segundo hijo ya no deberia detectar el fin de fichero.
¿Alguien me puede explicar esto?
Muchas gracias,
Saludos
Valora esta pregunta


0