#include "semaf.h" #include #include #define PERMISOS 0644 int crea_sem ( key_t clave, int valor_inicial ) { int semid = semget( /* Abre o crea un semáforo */ clave, /* con una cierta clave */ 1, /* con un solo elemento */ IPC_CREAT|PERMISOS /* lo crea (IPC_CREAT) con unos PERMISOS */ ); if ( semid== 1 ) return 1; /* Da el valor inicial al semáforo */ semctl ( semid, 0, SETVAL, valor_inicial ); return semid; } void borra_sem ( int semid ) { semctl(semid,0,IPC_RMID); } int abre_sem (key_t clave) /* Abrir un semáforo que otro proceso ya creó */ { return semget(clave,1,0); } void sem_P ( int semid ) /* Operación P */ { struct sembuf op_P [] = { 0, -1, 0 /* Decrementa semval o bloquea si cero */ }; semop ( semid, op_P, 1 ); } void sem_V ( int semid ) /* Operación V */ { struct sembuf op_V [] = { 0, 1, 0 /* Incrementa en 1 el semáforo */ }; semop ( semid, op_V, 1 ); }