You are on page 1of 4

// estudiante.

c
#include "libsem.h" // libreria para semforos
#include <sys/types.h>
#include <signal.h> // lbreria para signal
#include <stdio.h>
#include <stdlib.h>
#include "iniciador.h"
int main(void){
iniciador();
int numest = Semaph_Get(estudiantes);
printf("estudiante %d LLEGA\n",numest);
Semaph_Up(estudiantes);
if (Semaph_Get(mesa) == 0)
printf("estudiante %d ESPERA\n",numest);
Semaph_Down(mesa);
printf("estudiante %d SE SIENTA\n",numest);

if (Semaph_Get(marmita) == 0 && Semaph_Get(excmutua) == 1){


printf("estudiante LLAMA COCINERO\n");
Semaph_Up(cocinero);
}
Semaph_Down(marmita);
printf("estudiante %d COME\n",numest);
sleep(10);
printf("estudiante %d MARCHA\n",numest);
Semaph_Up(mesa);
Semaph_Down(estudiantes);

// cocinero.c
#include "libsem.h" // libreria para semforos
#include <sys/types.h>
#include <signal.h> // lbreria para signal
#include <stdio.h>
#include <stdlib.h>
#include "iniciador.h"
int main(void){
iniciador();
int bucle;
while (1){
printf("El cocinero est esperando aviso de alguien\n");
Semaph_Down(cocinero);
Semaph_Down(excmutua);
printf("cocinero INICIO\n");
sleep(10);
bucle = 0;
while (bucle < raciones){
Semaph_Up(marmita);

bucle++;
}
printf("cocinero FIN\n");
Semaph_Up(excmutua);

}
// iniciador.c
#include "libsem.h" // libreria para semforos
#include <sys/types.h>
#include <signal.h> // lbreria para signal
#include <stdio.h>
#include <stdlib.h>
#include "iniciador.h"
void iniciador(void){
// variables globales para los semforos
raciones = 5;
huecos_en_mesa = 3;
// manejador de seales para destruir los semforos cuando acabe el
programa
void manejador(int signum){
if (signum == SIGINT | SIGTERM){
Semaph_Destroy("mesa", mesa);
Semaph_Destroy("marmita", marmita);
Semaph_Destroy("cocinero", cocinero);
Semaph_Destroy("excmutua", excmutua);
Semaph_Destroy("estudiantes", estudiantes);
exit(EXIT_SUCCESS);
}
// Esto tambin se puede hacer con un swicth-case
if(signum == SIGUSR2){
printf("Ha llegado la seal SIGUSR2\n");
}
}
if (signal(SIGTERM, manejador) == SIG_ERR){
perror("error en la signal SIGTERM");
exit(EXIT_FAILURE);
}
if (signal(SIGINT, manejador) == SIG_ERR){
perror("error en la signal SIGINT");
exit(EXIT_FAILURE);
}
// Vamos a ignorar esta para usar todas las cosas
if (signal(SIGUSR1, SIG_IGN) == SIG_ERR){
perror("error en la signal SIGUSR1");
exit(EXIT_FAILURE);
}
if (signal(SIGUSR2, manejador) == SIG_ERR){
perror("error en la signal SIGUSR2");
exit(EXIT_FAILURE);
}

// creacion de semforos
mesa = Semaph_Create("mesa", huecos_en_mesa);
if (mesa == -1){
perror("error al crear el semforo mesa");
exit(EXIT_FAILURE);
}
marmita = Semaph_Create("marmita", raciones);
if (marmita == -1){
perror("error al crear el semforo marmita");
exit(EXIT_FAILURE);
}
cocinero = Semaph_Create("cocinero", 0);
if (cocinero == -1){
perror("error al crear el semforo cocinero");
exit(EXIT_FAILURE);
}
estudiantes = Semaph_Create("estudiantes", 0);
if(estudiantes == -1){
perror("fallo al crear el semforo de estudiantes");
exit(EXIT_FAILURE);
}
excmutua = Semaph_Create("excmutua", 1);
if (excmutua == -1){
perror("error al crear el semforo excmutua");
exit(EXIT_FAILURE);
}
}
// iniciador.h
#ifndef _FUNCIONES_H_
#define _FUNCIONES_H_
int mesa, marmita, cocinero, estudiantes, excmutua, raciones,
huecos_en_mesa;
void iniciador();
#endif

// mesa.c
#include "libsem.h" // libreria para semforos
#include <sys/types.h>
#include <signal.h> // lbreria para signal
#include <stdio.h>
#include <stdlib.h>
#include "iniciador.h"
int main(void){
iniciador();
while (1){
printf("Estudiantes: %d. Huecos en mesa: %d. Raciones
restantes: %d \n",\

Semaph_Get(estudiantes), Semaph_Get(mesa), Semaph_Get(marmita));


sleep(1);

}
// Makefile
INCLUDES=-I. -Ilibsem-0.2 -g
all: cocinero estudiante mesa
cocinero: iniciador.o cocinero.c
gcc ${INCLUDES} cocinero.c libsem-0.2/libsem.o iniciador.o -o
cocinero
estudiante: iniciador.o estudiante.c
gcc ${INCLUDES} estudiante.c libsem-0.2/libsem.o iniciador.o -o
estudiante
mesa: iniciador.o mesa.c
gcc ${INCLUDES} mesa.c libsem-0.2/libsem.o iniciador.o -o mesa
iniciador.o: iniciador.h iniciador.c
gcc ${INCLUDES} -c iniciador.c -o iniciador.o

NOTA: La solucin est hecha para que se pruebe en las terminales de linux y veas el
resultado. He creado un Makefile para que compiles todos los archivos fcilmente. Es tan
fcil como entrar en el directorio donde tengas creado todos los archivos (adems de la
biblioteca de semforos que nos dan), y escribir en la terminal
$make all
Con eso compilamos todo y tenemos nuestro programa listo para ejecutarse. Hacemos lo
siguiente (cada comando en una terminal distinta):
./mesa // para que nos muestre los resultados por pantalla
./cocinero // iniciamos el cocinero para que nos rellene la marmita cuando sea necesario
./estudiante // ejecutamos todos los estudiantes que queramos y vamos comprobando los
resultados que nos salen
./estudiante

You might also like