⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filosofos.c

📁 typical problem of the philosophers
💻 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 + -