📄 filosofos.c
字号:
#include <stdio.h>#include <stdlib.h>
#include <sys/ipc.h>
#include <semaforo.h>
#define N_FILOSOFOS 5
#define PENSANDO 0
#define COMIENDO 1
typedef struct Filosofos {
int estados[N_FILOSOFOS];
int pids[N_FILOSOFOS];
} Filosofos;
struct Filosofos *p_filosofos;
// Reservar semaforos y memoria compartida
int crea_filosofos(void)
{
int i;
int mem_id;
// Crea el area de memoria compartida
if((mem_id = shmget(IPC_PRIVATE, sizeof(Filosofos), 0774 | IPC_CREAT)) == -1)
return -1;
if(!(p_filosofos = (Filosofos *)shmat(mem_id,(char *)0,0)))
return -2;
// Crea el set de semaforos para los cubiertos
for (i = 0; i < N_FILOSOFOS; i++)
{
destruyeSemaforo(obtenSemaforo(i));
Crea_Semaforo(i, 1);
}
// Un semaforo que evitara el DeadLock destruyeSemaforo(obtenSemaforo(N_FILOSOFOS));
Crea_Semaforo(N_FILOSOFOS, N_FILOSOFOS - 1);
// Inicializa el area de memoria compartida
for(i = 0; i < N_FILOSOFOS; i++)
{
p_filosofos->pids[i] = 0;
p_filosofos->estados[i] = PENSANDO;
}
return mem_id;
}
// Liberar semaforos y memoria compartida
void elimina_filosofos(void)
{
int i;
shmdt((char *)p_filosofos);
for (i = 0; i <= N_FILOSOFOS; i++)
destruyeSemaforo(obtenSemaforo(i));
}
int main()
{
int res, i;
// Crea filosofos: reservar memoria, crear semaforos
if(crea_filosofos() < 0)
{
printf("Error %d\n",-res);
return 0;
}
// Crea los filosofos (procesos hijos)
for(i = 0; i < N_FILOSOFOS; i++)
{
if(!fork())
{
// Proceso hijo #i
p_filosofos->pids[i] = getpid();
while(1)
{
// Espera los dos cubiertos
P(obtenSemaforo(N_FILOSOFOS)); P (obtenSemaforo(i)); P(obtenSemaforo((i + 1) % N_FILOSOFOS));
// Comienza a comer
p_filosofos->estados[i] = COMIENDO; sleep ((random() % 5) + 1);
// Devuelve los dos cubiertos
V(obtenSemaforo(i));
V(obtenSemaforo((i + 1) % N_FILOSOFOS));
// Comienza a pensar
p_filosofos->estados[i] = PENSANDO; sleep((random() % 5) + 1); //Libera la posiblidad de DeadLock para el siguiente
V(obtenSemaforo(N_FILOSOFOS));
}
return 0;
}
}
// Bucle de espera del procesoprintf("Estoy comiendo"); padre
while(1)
{
// Muestra informacion
printf("Estado de los filosofos: \n");
for(i = 0; i < N_FILOSOFOS; i++)
printf("%d[%d] ==> %d\n", i , p_filosofos->pids[i], p_filosofos->estados[i]);
}
// Elimina los procesos hijos
for(i=0; i < N_FILOSOFOS; i++)
kill(p_filosofos->pids[i], 9);
elimina_filosofos();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -