«

»

Oct 12 2014

Programacion C Avanzada – T2 – Forks, pipes y como comunicar programa padre con hijo

Aquí os pongo un ejemplo de como trabajar con Forks, pipes y como realizar la comunicación entre un proceso padre y uno de sus hijos.

¿Que es un fork?

Se encarga de duplicar un proceso que estamos ejecutando. La copia es exacta por lo que las variables declaradas antes del fork existen en el padre y en el hijo y tienen el mismo valor justo después de crearse el proceso duplicado salvo por la variable que guardará la salida del fork. Una vez realizado el fork prosigue la ejecución desde la linea donde se ha quedado (justo la siguiente del fork) en padre y en hijo.

Guardamos la salida del fork en una variable integer “x” (en el código que veis mas abajo se llama pidHijo). Fork devolverá un integer con 3 posibles valores.

  • -1: Imposible crear el fork
  • 0: Se ha creado el fork, pero estamos en el proceso hijo.
  • Mayor a 0: Se ha creado el fork, estamos en el proceso padre y nos ha devuelto el PID del hijo.

Como al crear el fork se ha creado el proceso hijo y hemos igualado la variable pidHijo a lo que devuelve el fork, en el padre se ha asignado uno de los dos primeros valores ( error o  el pid del hijo ), pero en el hijo se ha asignado el valor 0. Ambos programas, siguen la ejecución por debajo del fork, por lo tanto padre e hijo entraran en un switch, haciendo que el padre realice una función y el hijo realice otra (al entrar en diferentes case).

¿Que es una pipe?

Una pipe viene a ser una tubería de comunicación entre el padre y el proceso hijo. Se crean antes de realizar el fork porque así, tanto padre como hijo tienen definidas las mismas pipes (si las creáramos después, serian diferentes y no funcionarían). Para ello definimos un array de integer de dos posiciones “int pipeA[2]”. Usaremos la posición “0” a modo de lectura y la posición “1” a modo de escritura. Las pipes “solo” tienen un sentido, si queremos hablar del padre al hijo, no podremos usar esa misma pipe para hablar del hijo al padre, para ello necesitamos crear otra pipe.

 

 

Si os preguntáis porque no uso printf o scanf para mostrar mensajes por pantalla, es porque los tenemos prohibidos (facilitan y malgastan memoria). Tenemos que usar las funciones read, write, open, close y los filedescriptors que necesitemos. El file descriptor 0 es el teclado y el filedescriptor 1 es la pantalla. Por ello en los write veis que viene seguido de un 1 y en los read seguido de un 0 (salvo en el caso de que se escriba en una pipe).

 

 

Ads Patrocinados / Publicidad

1 comentario

  1. gerardo

    bueno, no se si tu me podrías aclarar esta duda con el pipe, que pasaría si en vez de pasarle una cadena(al final de cuenta un puntero) , le paso un doble puntero int y le especifico el tamaño de este con sizeof, seria algo a si:

    int **datito;

    /*mucho codigo despues*/
    //entro en el hijo:

    //este caso es para el pipe que tiene comunicación hijo -> padre
    write(pipeHaP[1],datito,sizeof(datito));

Deja un comentario