APUNTES DE SEMÁFOROS
Las principales llamadas al sistema de semáforos son:
• semget. Crea y accede a un conjunto de semáforos
• semctl. Hace varias operaciones de control sobre el conjunto
• semop. Manipula los valores de los semáforos
1. SEMGET
Prototipo:
int semget(key_t key, int nsems, int semflg);
Argumentos:
key_t key: Una clave única que identifica el conjunto de
semáforos.
int nsems: El número de semáforos que se desea en el
conjunto. Debe ser un número positivo.
int semflg: Flag que determina las opciones para la creación
del conjunto. Puede ser una combinación de los siguientes:
o IPC_CREAT: Si el conjunto no existe, se crea uno nuevo.
o 0666: Permisos de acceso para el propietario, el grupo y
otros (usualmente se utilizan permisos octales).
Retorno:
Devuelve el identificador del conjunto de semáforos si tiene éxito; de
lo contrario, devuelve -1.
2. SEMCTL
Prototipo:
int semctl(int semid, int semnum, int cmd, ...);
Argumentos:
int semid: El identificador del conjunto de semáforos (devuelto
por semget).
int semnum: El índice del semáforo dentro del conjunto. Debe
estar entre 0 y nsems-1.
int cmd: El comando que indica la operación que se va a
realizar. Algunos de los comandos más comunes son:
o GETVAL: Obtiene el valor actual del semáforo
especificado.
o SETVAL: Establece el valor del semáforo especificado
(requiere un argumento adicional).
o GETALL: Obtiene los valores de los semáforos y los
deposita en la lista apuntada.
o IPC_RMID: Elimina el conjunto de semáforos (se requiere
que se llame con semnum generalmente como 0,
aunque no es relevante).
Retorno:
Devuelve el resultado de la operación solicitada. En el caso de
errores, devuelve -1.
3. SEMOP
Prototipo:
int semop(int semid, struct sembuf *sops, size_t nsops);
Argumentos:
int semid: El identificador del conjunto de semáforos (devuelto
por semget).
struct sembuf *sops: Un puntero a una estructura de tipo
sembuf, que especifica la operación a realizar. Cada sembuf
contiene:
o short sem_num: El índice del semáforo en el conjunto.
o short sem_op: La operación a realizar (puede ser
positiva para incrementar o negativa para decrementar).
o short sem_flg: Opciones adicionales, como SEM_UNDO
(el kernel
invierte el efecto de cada operación sobre el semáforo
que el proceso haya hecho. El efecto neto es dejar el
semáforo con el valor con que se inició).
size_t nsops: El número de operaciones que se van a realizar.
Puede ser uno o más, según el número de elementos en el array
sops.
Retorno:
Devuelve 0 si tiene éxito; de lo contrario, devuelve -1.