NOMBRE
msgget − devuelve el identificador para una cola de mensajes
SINOPSIS
#include
<sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
DESCRIPCIÓN
La función devuelve el identificador de la cola de mensajes asociada a key. Se crea una nueva cola de mensajes si key tiene el valor IPC_PRIVATE, o si key no es IPC_PRIVATE pero no existe ninguna cola de mensajes asociada a key, y IPC_CREAT se inserta en msgflg (esto es, msgflg&IPC_CREAT es distinto de cero). La presencia en msgflg de los campos IPC_CREAT y IPC_EXCL desempeñan el mismo papel, con respecto a la existencia de la cola de mensajes, que O_CREAT y O_EXCL en el argumento "mode" de la llamada al sistema open(2), es decir, la función msgget falla si msgflg inserta IPC_CREAT y IPC_EXCL y ya esiste una cola de mensajes para key.
En la creación, los 9 bits más bajos del argumento msgflg definen los permisos de acceso a la cola de mensajes. Estos bits para los permisos tienen la misma forma y semántica que los de los permisos de acceso en las llamadas al sistema open(2) o creat(2) (Los permisos de ejecución no son usados.)
Si se crea una nueva cola de mensajes, la llamada al sistema inicializa la estructura de datos del sistema para la cola msqid_ds como se muestra:
msg_perm.cuid y msg_perm.uid son fijados al identificador del usuario efectivo del proceso invocador.
msg_perm.cgid y msg_perm.gid son fijados al identificador de grupo efectivo del proveso invocador.
Los 9 bits más bajo de msg_perm.mode son fijados a los 9 bits más bajos de msgflg.
msg_qnum, msg_lspid, msg_lrpid, msg_stime y msg_rtime son puestos a 0.
msg_ctime contendrá la hora actual
msg_qbytes será igual al límite impuesto por el sistema MSGMNB.
Si la cola de mensajes ya existe, se verifican los permisos de acceso, y ser realiza una comprobación a fin de verificar si está marcada para su destrucción.
VALOR DEVUELTO
Si ha funcionado correctamente, devuelve el idenficador para la cola de mensajes (un entero no negativo), en otro caso −1 con errno indicando el error.
ERRORES
En caso de error, errno tendrá uno de los siguientes valores:
EACCES |
Existe una cola de mensajes para key, pero el proceso no tiene permiso de acceso a la cola. | ||
EEXIST |
Existe una cola de mensajes para key y msgflg contiene IPC_CREAT y IPC_EXCL. | ||
ENOENT |
No existe una cola de mensajes para key y msgflg no contiene IPC_CREAT. | ||
ENOMEM |
Una cola de mensajes ha de ser creada pero el sistema no contiene suficiente memoria para la nueva estructura de datos. | ||
ENOSPC |
Una cola de mensajes ha de ser creada pero el límite del sistema para el máximo número de colas de mensajes (MSGMNI) será superado. |
OBSERVACIONES
IPC_PRIVATE no es un campo de tipo bandera, es del tipo key_t. Si este valor especial es utilizado por key, la llamada al sistema ignorará todo excepto los 9 bits de menor orden de msgflg y crea una nueva cola de mensajes (si ha funcionado).
Lo siguiente es una limitación en los recursos del sistema que afecta a la llamada msgget
MSGMNI |
Número máximo de colas de mensajes soportadas por el sistema: depende de la política tomada. |
FALLOS
La elección del nombre IPC_PRIVATE puede que fuera desafortunada, IPC_NEW mostraría más claramente su función.
CONFORME A
SVr4, SVID. Hasta la versión 2.3.20 Linux devolvía EIDRM cuando se llamaba a msgget con una cola de mensajes planificada para ser borrada.