2.3.2 Paso de mensajes

El paso de mensajes es la herramienta básica de comunicación entre procesos. Un proceso puede mandar cualquier información a otro mediante este procedimiento.


El paso de mensajes se puede usar para la sincronización de procesos.


Ventajas del paso de mensajes:

  • Fácilmente transportable de sistemas monoprocesadores a sistemas de memoria compartida o a sistemas distribuidos.
  • Fomenta la modularidad y la arquitectura cliente-servidor.
  • Funciones (primitivas) relacionadas con el paso de mensajes:
    1. send (destino, mensaje).
    2. receive (origen, mensaje).

Cómo concretar estas primitivas en un sistema dado son las cuestiones de diseño.

Error al cargar imagen figura_11.png

Figura 11. Paso de mensajes.

    //Ejemplo 1: 
        //El ejemplo es un código en c con tuberías que para ejemplificar el perfecto de la comunicación entre procesos
                                
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #include <time.h>
            
    int main(void) {
                                                        // Definir dos descriptores de archivo para las tuberías
        int fd[2];
        int fd2[2];

                                                        // Definir una variable para el ID del proceso
        pid_t pid;

                                                        // Definir los mensajes que se enviarán
        char saludoPadre[] = "Buenos días hijo.";
        int tamSaludoPadre = strlen(saludoPadre);
        char buffer[tamSaludoPadre];
        char despedidaHijo[] = "Adiós papá.";
        int tamDespedidaHijo = strlen(despedidaHijo);
        char buffer2[tamDespedidaHijo];

                                                        // Generar un número aleatorio
        srand(time(NULL));
        int num = rand() % 101;
        char numRandom[3];
        sprintf(numRandom, "%d", num);
        int tamNumeroRandom = strlen(numRandom);
        char buffer3[tamNumeroRandom];

                                                        // Crear las tuberías
        pipe(fd);
        pipe(fd2);

                                                        // Crear el proceso hijo
        pid = fork();

        switch (pid) {
            case -1:
                printf("No se ha podido crear hijo...\n");
                exit(-1);
                break;
            case 0: // Proceso hijo
                                                        // Cerrar el descriptor de escritura en la tubería del hijo
                close(fd[1]);

                                                        // Leer el mensaje del padre
                read(fd[0], buffer, tamSaludoPadre);
                printf("\t\t%s\n", buffer);

                                                        // Cerrar el descriptor de lectura en la tubería del hijo
                close(fd[0]);

                                                        // Despedirse del proceso padre
                write(fd[1], despedidaHijo, tamDespedidaHijo);

                                                        // Cerrar el descriptor de lectura en la segunda tubería del hijo
                close(fd2[0]);

                                                        // Escribir el número aleatorio en la segunda tubería
                write(fd2[1], numRandom, tamNumeroRandom);
                break;

                default:                                // Proceso padre
                                                        // Cerrar el descriptor de lectura en la tubería del padre
                close(fd[0]);

                                                        // Escribir el mensaje de saludo al hijo
                write(fd[1], saludoPadre, tamSaludoPadre);

                                                        // Esperar a que el hijo termine
                wait(NULL);

                                                        // Cerrar el descriptor de escritura en la tubería del padre
                close(fd[1]);

                                                        // Leer el mensaje de despedida del hijo
                read(fd[0], buffer2, tamDespedidaHijo);
                printf("\t\t%s\n", buffer2);

                                                        // Cerrar el descriptor de escritura en la segunda tubería del padre
                close(fd2[1]);

                                                        // Leer el número aleatorio del hijo
                read(fd2[0], buffer3, tamNumeroRandom);
                printf("\t\t%s\n", buffer3);
                break;
        }
        return 0;
    }
                            
                    

Código 7. Comunicación entre procesos con tuberías.

Reflexiona la siguiente pregunta que será tratada en la sesión de clase.

¿Qué funciones desconoces del código 7 mostrado anteriormente?