Después de darle toda la tarde al tema pienso que más o menos lo entiendo (al menos lo básico) por lo que lo voy a intentar explicar.
Lo primero, necesitamos la librería #include <sys/sem.h>
Y además tenemos que declarar una union tipo semun
...........................
union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};
............................
struct sembuf oper;
union semun arg;
.............................
Ahora lo primero es obtener la clave del semáforo (cada mecanismo IPC debe estar identificado con una clave)
...........................
clave = ftok("ruta",'letra');
...........................
una vez tenemos la clave creamos el array de semáforos y obtenemos su identificador
...........................
ID = semget(clave, 1, IPC_CREAT | 0600); //en este caso un array de 1 semáforo.
...........................
A continuación inicializamos el semáforo (verde)
...........................
arg.val = 1;
int control = semctl (ID, 0, SETVAL, arg);
...........................
Ahora ya podemos trabajar con el semáforo en nuestra sección critica.
...........................
//probar(P)
oper.sem_num = 0;
oper.sem_op = -1;
oper.sem_flg = 0;
semop (ID, &oper, 1);
//seccion critica
//incrementar(V)
oper.sem_num = 0;
oper.sem_op = 1;
oper.sem_flg = 0;
semop (ID, &oper, 1);
En las operaciones oper.xxx estamos preparando el struct sembuf para luego realizar la operación de forma atómica con semop().
Culex.
No hay comentarios:
Publicar un comentario