Red de conocimiento informático - Material del sitio web - Cómo usar errno para determinar el valor de retorno de msgrcv

Cómo usar errno para determinar el valor de retorno de msgrcv

msgrcv/msgsnd es el mecanismo para la comunicación asincrónica o entre procesos en sistemas Linux. Estas dos funciones se utilizan principalmente para operar colas de mensajes específicas. msgrcv() puede leer mensajes de la cola de mensajes y msgsnd() puede escribir mensajes nuevos en la cola.

msgrcv() puede leer mensajes de la cola de mensajes y msgsnd() puede escribir mensajes nuevos en la cola.

El envío y recepción de mensajes se realiza en la cola de mensajes. Para enviar un mensaje, el proceso que llama debe tener permiso de escritura al escribir en la cola de mensajes. Para recibir mensajes, el proceso de llamada debe tener permiso de lectura. h>

Prototipo de función

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

size_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

Parámetros

msqid: el identificador de la cola de mensajes.

msgp: puntero del búfer de mensajes. Esta ubicación se utiliza para almacenar temporalmente los mensajes enviados y recibidos. Es una estructura general definible por el usuario con la siguiente forma

struct msgbuf {

long mtype; /* Tipo de mensaje, debe ser 0 */

char mtext[1] /* Texto del mensaje*/

}; p>msgsz: Tamaño del mensaje.

msgtyp: tipo de mensaje

Cuando msgtyp es igual a 0, se devuelve el mensaje más antiguo de la cola.

Cuando msgtyp es mayor que 0, se devuelve el primer mensaje de tipo mtype.

msgtyp menor que 0 devolverá el mensaje más pequeño cuyo tipo sea menor o igual al valor absoluto del parámetro mtype.

msgflg: Este parámetro sigue siendo un indicador que controla el comportamiento de la función. Puede tener los siguientes valores: 0, que significa ignorar; IPC_NOWAIT, si la cola de mensajes está vacía, se devuelve ENOMSG y se controla. se devuelve al proceso que llamó a la función. Si no se especifica este parámetro, el proceso se bloqueará hasta que la función obtenga un mensaje calificado de la cola. Si la cola se elimina mientras el cliente espera un mensaje, se devuelve EIDRM. MSG_NOERROR Si la longitud del mensaje obtenido por la función excede msgsz, solo se devolverá el mensaje con la longitud de msgsz y los mensajes restantes se descartarán. Si no se especifica este parámetro, se devuelve E2BIG y el mensaje permanecerá en la cola y no se eliminará. Cuando se elimina un paquete de la cola, el paquete correspondiente también se elimina de la cola.

Descripción del valor de retorno

Cuando se ejecuta correctamente, msgsnd() devuelve 0 y msgrcv() devuelve el número real de bytes copiados en la matriz de texto m.

Cuando la ejecución falla, devuelven -1 y errno se establecen en uno de los siguientes valores

[Para msgsnd]

EACCES: el proceso que llama no tiene permiso para escribir en el mensaje cola, ni sin permiso CAP_IPC_OWNER

EAGAIN: el mensaje no se puede enviar debido al límite de msg_qbytes de la cola de mensajes y al indicador IPC_NOWAIT especificado en msgflg

EFAULT: el espacio de memoria al que apunta El puntero msgp es inaccesible

EIDRM: la cola de mensajes ha sido eliminada

EINTR: la espera de espacio libre en la cola de mensajes fue interrumpida por una señal

EINVAL: Parámetro no válido

ENOTR .p>

ENOMEM: Memoria del sistema insuficiente para copiar el mensaje señalado por msgp

[Para msgrcv]

E2BIG: la longitud del texto del mensaje es mayor que msgsz y MSG_NOERROR no se especifica en msgflg

EACCES: el proceso de llamada no tiene capacidades de lectura y no tiene CAP_IPC_OWNER

EAGAIN: la cola de mensajes está vacío y no se especificó IPC_NOWAIT en msgflg

EFAULT: el espacio señalado por msgp es inaccesible

EIDRM: el mensaje se ha eliminado mientras el proceso está inactivo y esperando recibir el mensaje