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)