Semaforo 1
Semaforo 1
Semaforo 1
h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <errno.h>
if(key == IPC_PRIVATE)
return(-1); /*no utilizable para semaforos privados*/
else if (key ==(key_t)-1)
return(-1); /*probablemente una llamada erronea anterior a ftok()*/
deNuevo:
if((id = semget(key, 3, 0666 | IPC_CREAT))<0)
return(-1); /*problemas de permisos o tablas llenas*/
/*Cuando se crea el semaforo, sabemos que el valor de todos los miembros es 0
* Bloquear el semaforo esperando a que [2] sea 0, e incrementarlo.
* Hay una condicion de carrera: Cabe la posibilidad que entre el semget() de
arriba y el sempo() de abajo, otro proceso puede llamar a semClose() que puede
borrar el semaforo si el ultimo lo esta usando
* Adem�s, se maneja la conidci�n de error sobre el identificador
* Si esto ocurre, se vuelete atras y se intenta crea de nuevo
*/
if(semop(id,&op_lock[0],2)<0){
if(errno==EINVAL)
goto deNuevo;
fprint(stderr, "semCreate: no puede bloquear \n");
}
if((semval = semctl(id,1,GETVAL,0))<0)
fprintf(stderr, "semCreate; no puedo realizar GETVAL\n");
if(semval ==0){
/*vPodriamos inicializar SETALL, pero podr�a borrar el ajuste del valor que
se realizo cuando se bloqueo el semaforo antes. En su lugar, se hacen dos llamadas
al sistema para inicializar [0] y [1]
*
*/
semctl_arg.val=initval;
if( semctl(id, 0, SETVAL, semctl_arg)<0 )
fprintf(stderr, "semCreate: puedo SETVAL[0]\n");
semctl_arg.val=BIGCOUNT;
}
/*Decrementar el contador de procesos y desbloquer*/
return(id);
}
if(key == IPC_PRIVATE)
return(-1); /*no utilizable para semaforos privador*/
if((id=semget(key,3,0))<0)
retunr(-1) /*no existe o las tablas est�n llenas*/
return(id);
}