Benemérita Universidad Autónoma de Puebla Sistemas Operativos Alumno JOSÉ ANTONIO MÉNDEZ BARRIOS Programa 1. Programa que envía mensajes a otro proceso a través de un fifo. /* sendmsg.c */ #include <fcntl.h> #include <stdio.h> #include <errno.h> #define MSGSIZE 63 int errno; char *fifo=”fifo”; void fatal (char *s) { perror(s); exit(1); } main(argc, argv) int argc; char *argv[]; { int fd, j, nwrite; char msgbuf[MSGSIZ+1]; if (argc < 2) { fprintf(stderr, “uso: sendmsg mensaje ...\n”); exit(1); } if ((fd=open(fifo, O_WRONLY|O_NDELAY))<0) fatal(“Fallo al abrir el fifo”); for (j=1; j<argc; j++) { if (strlen (argv[j]) > MSGSIZE) { fprintf(stderr, “mensaje demasiado largo %s\n”, argv[j]); continue; } strcpy (msgbuf, argv[j]); if ((nwrite=write(fd, msgbuf, MSGSIZE+1)) <= 0) { if (nwrite==0) errno=EAGAIN; /*fifo vacio*/ fatal (“La escritura al fifo ha fallado”); } } exit(0); } R=ENVIA UN MENSAJE CON UNA FIFO Programa 2. Programa que recibe mensajes vía fifo /*rcvmsg.c */ #include <fcntl.h> #include <stdio.h> #define MSGSIZE 63 char *fifo=”fifo”; main( argc, argv) int argc; char *argv[]; { int fd; char msgbuf[MSGSIZE+1]; /*se abre el fifo para lectura y escritura */ if ((fd=open(fifo, O_RDWR))<0) fatal(“Fallo al abrir el fifo”); for(;;) { if (read(fd, msgbuf, MSGSIZE+1)<0) fatal(“La lectura del mensaje fallo”); printf(“Mensaje recibido: %s\n”, msgbuf); } } 1. Compila cada programa por separado con gcc 2. Ejecuta cada programa desde una terminal diferente. ./programa 1 mensaje ./programa 2 3. Revisa los resultados R=HABRE LA FIFO PARA LEER EL MENSAJE Programa 3 //lector_fifo.c - Tuberia con nombre usando mkfifo */ #include <stdlib.h> #include <fcntl.h> #include <sys/mode.h> int linea (int df, char *cad); int main () { int descr; char cadena[100]; unlink ("tuberia"); mkfifo ("tuberia", 0); chmod ("tuberia", 460); descr = open ("tuberia", O_RDONLY); while (linea (descr, cadena)) printf ("%s\n", cadena); close (descr); pritnf ("Fin del lector.\n"); } int linea (int df, char *cad) { int n; do { n = read (df, cad, 1); } while (n > 0 && *cad++ != NULL); return (n > 0); } Programa 4 //escrtor_fifo.c #include <stdlib.h> #include <fcntl.h> #include <sys/mode.h> int main () { int descr, longmens, i; char mensaje[100]; sprintf (mensaje, "Un saludo desde el proceso %d", getpid ()); longmens = strlen (mensaje) + 1; do { /* intentar la conexion */ descr = open ("tuberia", O_WRONLY); if (descr == -1) sleep (1); } while (descr == -1); for (i=0; i<3; i++) { write (descr, mensaje, longmens); sleep (3); } close (descr); printf "Fin del escritor %d\n", getpid ()); } -------------------------------------------------------------------------------- Escrib esto en un archivo llallado ksh #!/bin/ksh # fifo - Carga los procesos lector y escritor en 2o plano. lector_fifo.e & escritor_fifo.e & escritor_fifo.e & Esta es un ejemplo de la salida $ fifo $Un saludo desde el proceso 11996 Un saludo desde el proceso 10971 Un saludo desde el proceso 11996 Un saludo desde el proceso 10971 Un saludo desde el proceso 11996 Un saludo desde el proceso 10971 Fin del escritor 10971 Fin del escritor 11996 Fin del lector PREGUNTAS: ¿Explica la diferencia entre los dos tipos de tuberías básicas? Una es mas rápida que la otra ¿Qué comandos son comunes a las dos tipos de tuberías? R= los dos utilizan fifos ¿Qué limitaciones tienen las tuberías en general como mecanismo de comunicación entre los procesos? R=