NOMBRE¶
semget - obtiene el identificador de un conjunto de semáforos
SINOPSIS¶
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key_t key, int nsems,
int semflg);
DESCRIPCIÓN¶
Esta función devuelve el identificador del conjunto de semáforos
asociado con el argumento
key. Un nuevo conjunto de
nsems
semáforos se crea si
key tiene el valor
IPC_PRIVATE, o si
no hay un conjunto de semáforos asociado a
key y el bit
IPC_CREAT vale 1 en
semflg (p.ej.
semflg &
IPC_CREAT es distinto de cero).
La presencia en
semflg de los campos
IPC_CREAT e
IPC_EXCL
tiene el mismo papel, con respecto a la existencia del conjunto de
semáforos, que la presencia de
O_CREAT y
O_EXCL en el
argumento mode de la llamada del sistema
open(2): p.ej., la
función
semget falla si
semflg tiene a 1 tanto
IPC_CREAT como
IPC_EXCL y ya existe un conjunto de
semáforos para
key.
Acerca de la creación, los 9 bits bajos del argumento
semflg definen
los permisos de acceso (para el propietario, grupo y otros) para el conjunto
de semáforos. Estos bits tienen el mismo formato, y el mismo significado
que el argumento de modo en las llamadas al sistema
open(2) o
creat(2) (aunque los permisos de ejecución no son significativos
para los semáforos, y los permisos de escritura significan permisos para
alterar los valores del semáforo).
Cuando se crea un nuevo conjunto de semáforos,
semget inicializa la
estructura de datos
semid_ds asociada al conjunto de semáforos
como sigue:
- Se pone el ID de usuario efectivo del proceso que realiza
la llamada en sem_perm.cuid y sem_perm.uid
- Se pone el ID de grupo efectivo del proceso que realiza la
llamada en sem_perm.cgid y sem_perm.gid
- Los 9 bits más bajos de sem_perm.mode se ponen
como los 9 bits más bajos de semflg.
- Se pone el valor de nsems en sem_nsems.
- sem_otime se pone a 0.
- Se pone la hora actual en sem_ctime.
El argumento
nsems puede ser
0 (un comodín o valor sin
importancia) cuando no se está creando un conjunto de semáforos. En
otro caso
nsems debe ser mayor que
0 y menor o igual que el
número máximo de semáforos por conjunto de semáforos,
(
SEMMSL).
Si el conjunto de semáforos ya existe, los permisos de acceso son
verificados.
VALOR DEVUELTO¶
Si hubo éxito, el valor devuelto será el identificador del conjunto de
semáforos (un entero no negativo), de otro modo, se devuelve
-1
con
errno indicando el error.
ERRORES¶
En caso de fallo,
errno tendrá uno de los siguientes valores:
- EACCES
- Existe un conjunto de semáforos para key, pero
el proceso que realiza la llamada no tiene permisos para acceder al
conjunto.
- EEXIST
- Existe un conjunto de semáforos para key y
semflg tiene a 1 tanto IPC_CREAT como IPC_EXCL.
- ENOENT
- No existe ningún conjunto de semáforos para
key y semflg no tiene a 1 IPC_CREAT.
- EINVAL
- nsems es menor que 0 o mayor que el límite en
el número de semáforos por conjunto de semáforos
(SEMMSL), o ya existe un conjunto de semáforos que se
corresponde con key , y nsems es mayor que el número de
semáforos en ese conjunto.
- ENOMEM
- Se ha de crear un conjunto de semáforos, pero el
sistema no tiene suficiente memoria para la nueva estructura de
datos.
- ENOSPC
- Se ha de crear un conjunto de semáforos, pero el
límite del sistema para el número máximo de conjuntos de
semáforos (SEMMNI), o el número de semáforos
máximo del sistema (SEMMNS), sería excedido.
OBSERVACIONES¶
IPC_PRIVATE no es un campo bandera (flag), sino que es de tipo
key_t Si este valor especial es usado para
key, la llamada del
sistema ignora todo excepto los 9 bits más bajos de
semflg y crea
un nuevo conjunto de semáforos (si hay éxito).
Los siguientes son límites de los recursos de los conjuntos de
semáforos que afectan a la llamada
semget :
- SEMMNI
- Máximo total de conjuntos de semáforos para el
sistema: depende de la política.
- SEMMSL
- Máximo de semáforos por semid: depende de la
implementación (500 normalmente).
- SEMMNS
- Máximo total de semáforos para el sistema:
depende de la política. Valores mayores que SEMMSL * SEMMNI lo
hacen irrelevante.
FALLOS¶
La elección del nombre IPC_PRIVATE fue quizás desafortunada, IPC_NEW
mostraría más claramente su función.
La estructura de datos asociada con cada semáforo del conjunto no es
inicializada por la llamada del sistema. Para inicializar estas estructuras de
datos, se ha de ejecutar la subsiguiente llamada a
semctl(2) para
realizar una orden
SETVAL o
SETALL en el conjunto de
semáforos.
SVr4, SVID. SVr4 documenta condiciones de error adicionales EFBIG, E2BIG,
EAGAIN, ERANGE, EFAULT.
VÉASE TAMBIÉN¶
ftok(3),
ipc(5),
semctl(2),
semop(2)