SEMGET(2) | Manual del Programador de Linux | SEMGET(2) |
semget - obtiene el identificador de un conjunto de semáforos
#include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h>
int semget(key_t key, int nsems, int semflg);
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:
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.
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.
En caso de fallo, errno tendrá uno de los siguientes valores:
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 :
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.
4 enero 2002 | Linux 2.5 |