Benemérita Universidad Autónoma de Puebla

Anuncio
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=
Descargar