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:
- send (destino, mensaje).
- receive (origen, mensaje).
Cómo concretar estas primitivas en un sistema dado son las cuestiones de diseño.
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?