¿Quién acaba antes? ¿El padre o el hijo?

Imagen de thepunishercadiz
0 puntos

Buenas noches.

Estoy un poco desesperado con la comunicación de procesos usando llamadas al sistema en C y tengo la siguiente duda:

Dado este código, ¿quién acabaría primero, padre o hijo?. Yo diría que hijo, porque padre está esperando a que hijo le envíe dato a través de la pipe. ¿no sería así?

Muchas gracias de antemano.

int main(....){

int p1[2];
int i;
int n=0;
pipe(p1);
switch(fork())
{
case 0:
close(1);
dup(p1[1]);
write(1, &n, sizeof(int));
break;

default:
close(0);
dup(p1[0]);
}
close(p1[0]); close(p1[1]); // *
read(0, &i, sizeof(int));
printf(He recibido un %d", i);

}

Imagen de slap
+1
0
-1

Yo, de entrada, no veo muy correcto el código.
Ya que las 3 instrucciones del final las ejecutan tanto el padre como el hijo.
Y tampoco creo que sea correcto cerrar la pipe antes de leer de la entrada.

Saludos.
----
Slap

+1
0
-1

Saludos.

0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://www.injiniero.es

Imagen de thepunishercadiz
+1
0
-1

Estimado Slap.

Gracias por tu respuesta. Entonces deduzco que padre e hijo se quedan esperando a leer de la pipe? Lo digo por eso de cerrarla antes de leerla.

+1
0
-1
Imagen de slap
+1
0
-1

Por lo que he probado, cerrar los descriptores p1[x] no cierra el pipe, por lo que sí que continúa la comunicación entre padre e hijo.

Aquí lo que ocurre es que el padre sí que puede leer lo que le ha escrito el hijo y el hijo se queda parado en el read porque no recibe nada de su entrada estándar. Después de leer, el padre acaba y el hijo se queda esperando a recibir algo por su entrada estándar.

Si lo pruebas, cuando acabe el padre pulsa una tecla y verás como acaba el hijo:

  1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <sys/types.h>
  4 
  5 int main(void){
  6 
  7         int p1[2];
  8         int i;
  9         int n=0;
 10 
 11         pipe(p1);
 12 
 13         switch(fork()){
 14                 case 0:
 15                         printf("Hijo: %d\n",getpid());
 16                         fflush(stdout);
 17                         close(1);
 18                         dup(p1[1]);
 19                         write(1, &n, sizeof(int));
 20                         break;
 21 
 22                 default:
 23                         printf("Padre: %d\n",getpid());
 24                         fflush(stdout);
 25                         close(0);
 26                         dup(p1[0]);
 27         }
 28 
 29         close(p1[0]); close(p1[1]); // *
 30         read(0, &i, sizeof(int));
 31         fprintf(stderr,"He recibido un %d, soy: %d\n", i,getpid());
 32         fflush(stderr);
 33 }

Saludos.
----
Slap

+1
0
-1

Saludos.

0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://www.injiniero.es

Imagen de thepunishercadiz
+1
0
-1

Una vez más me quito el sombrero Slap. Tu respuesta clara y concisa me ha hecho entender el proceso.

Muchas gracias por todo.

+1
0
-1