SEMGET(2)

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 )

DESCRIPCION
La función devuelve el identificador del conjunto de semáforos asociado al valor del argumento key. Un nuevo conjunto de nsems semáforos se crea si key tiene el valor IPC_PRIVATE, o si key no vale IPC_PRIVATE, no hay una cola de mensajes asociada 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 msgget 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) al conjunto de semáforos en el mismo formato, y con el mismo significado, que para el parámetro de permisos de acceso en las llamadas al sistema open(2) o creat(2) (aunque los permisos de ejecución no son usados por el sistema, y los de escritura, para un conjunto de semáforos, efectivamente significa permisos de modificación).

Además, durante la creación, la llamada al sistema inicializa la estructura de datos semid_ds del conjunto de semáforos del sistema, 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 la llamada del sistema no es de creación. En otro caso nsems debe ser mayor que 0 y menor o igual que el número máximo de semáforos por semid, (SEMMSL).

Si el conjunto de semáforos ya existe, los permisos de acceso son verificados, y se hace una comprobación para ver si está marcado para ser destruido.

VALOR REGRESADO
Si hubo éxito, el valor devuelto será el identificador del conjunto de semáforos (un entero positivo), de otro modo, se devuelve -1 con errno indicando el error.

ERRORES
Para un retorno fallido, errno tendrá uno de entre los siguientes valores:

EACCES
    Existe un conjunto de semáforos para key, pero el proceso que realiza la llamada no tiene permisos de acceso al conjunto.

EEXIST
    Existe un conjunto de semáforos para key y semflg tiene a 1 tanto IPC_CREAT como IPC_EXCL.

EIDRM
    El conjunto de semáforos está marcado para ser borrado.

ENOENT
    No existe ningún conjunto de semáforos para key y semflg no tiene a 1 IPC_CREAT.

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.

NOTAS
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 (BUGS)
El uso de IPC_PRIVATE no inhibe el acceso de los demás procesos al conjunto de semáforos asignado.

Al igual que pasa con los ficheros, no hay una manera intrínseca para que un proceso se asegure el acceso exclusivo a un conjunto de semáforos. Tener a 1 tanto IPC_CREAT como IPC_EXCL en semflg solo asegura (si hay éxito) la creación de un nuevo conjunto de semáforos, no implica acceso exclusivo a dicho conjunto.

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 un comando SETVAL o SETALL en el conjunto de semáforos.

CONFORMA CON
SVr4, SVID. SVr4 documenta condiciones de error adicionales EINVAL, EFBIG, E2BIG, EAGAIN, ERANGE, EFAULT.

VEASE
ftok(3), ipc(5), semctl(2), semop(2).