Semáforos Creación de Semaforos (semget) semget() podemos crear o acceder a un conjunto de semáforos unidos bajo un identificador común. Int semget (key_t key, int nsems, int semflg); semget -1 fallo ID ejecución satisfactoria Donde: Key es la llave que identifica a que grupo de semáforos queremos acceder nsems es el total de semáforos que van a estar agrupados bajo el identificador devuelto por semget. Semflg es una máscara de bits que indica el modo de adquisición del identificador Control estructura de semáforos (semctl) Con semctl podemos acceder a la información administrativa y de control que dispone el núcleo sobre un semáforo. int semctl(int semid, int semnum, int cmd, arg) Union semnun{ int val; struct semid_ds *buf; ushort *array; }arg; La llamada actúa sobre el conjunto de semáforos que responden al identificador semid devuelto por una llamada previa a semget. semnum indica cual es el semáforo de los que hay bajo semid, al que queremos acceder •GETVAL lee el valor de un semáforo •SETVAL inicializa un semáforo a un valor determinado especificado en arg. •GETPID lee el PID del último proceso que actuó sobre el semáforo. cmd •GETALL permite leer el valor de todos los semáforos asociados al identificador semid. •SETALL inicializa el valor de todos los semáforos asociados al identificador semid. •IPC_STAT e IPC_SET permite leer y modificar la información administrativa asociada al identificador semid •IPC_RMID le indica al núcleo que debe borrar el conjunto de semáforos agrupados bajo el identificador semid Operaciones P y V (semop) Int semop(int semid, struct sembuf *sops, int nsops) Donde: sops es un puntero a un array de estructuras que indican las operaciones que llevarán a cabo sobre los semáforos. nsops es el total de elementos que tiene el arreglo de operaciones. Cada elemento del array es una estructura del tipo sembuf. struct sembuf { sem_num; //número del semáforos (0≥índice≤N-1) short sem_op; //operación: P o V short sem_flg; //máscara de bits }; • Si sem_op<0 entonces el valor del semáforo se decrementa, lo que equivale a una operación P • Si sem_op>0 entonces el valor del semáforo se incrementa, lo que equivale a una operación V • Si sem_op=0 entonces el valor del semáforo no sufre ningún cambio. Sem_flg • IPC_NOWAIT la llamada a semop devuelve el control en caso de que no se pueda satisfacer la operación especificada en sem_op. La forma de trabajar por defecto es IPC_WAIT • SEM_UNDO, la operación se deshace cuando el proceso termina.