miércoles, 28 de diciembre de 2016

Diseño y Administracion de SO - UNED (Usando semáforos)

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