Pregunta

Estoy tratando de enviar "prueba" del mensaje con Mqueue, pero la recepción de mensajes falla con EMSGSIZE. Código:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <sys/types.h>
#include <sys/wait.h>
#include <mqueue.h>
#include <errno.h>

using namespace std;

int main() {
mqd_t mqdes;
mqdes = mq_open("/mq.12345", O_RDWR | O_CREAT, (S_IRWXU | S_IRWXG | S_IRWXO), NULL);

if (mqdes == -1) {
    switch (errno) {
    case EACCES:
        cout << "EACCESS" << endl;
        break;
    case EEXIST:
        cout << "EEXIST" << endl;
        break;
    case EINTR:
        cout << "EINTR" << endl;
        break;
    case EINVAL:
        cout << "EINVAL" << endl;
        break;
    case EMFILE:
        cout << "EMFILE" << endl;
        break;
    case ENAMETOOLONG:
        cout << "TOOLONG" << endl;
        break;
    case ENFILE:
        cout << "ENFILE" << endl;
        break;
    case ENOENT:
        cout << "ENOENT" << endl;
        break;
    case ENOSPC:
        cout << "ENOSPC" << endl;
        break;
    }
} else {
    cout << "Success" << endl;
}

pid_t pid;
pid = fork();
if (pid > 0) {
    //  Child process
    string serialized = "test";
    if (mq_send(mqdes, serialized.c_str(), strlen(serialized.c_str()), 0) != 0){
        switch (errno) {
        case EAGAIN:
            cout << "EAGAIN" << endl;
            break;
        case EBADF:
            cout << "EBADF" << endl;
            break;
        case EINTR:
            cout << "EINTR" << endl;
            break;
        case EINVAL:
            cout << "EINVAL" << endl;
            break;
        case EMSGSIZE:
            cout << "EMSGSIZAE" << endl;
            break;
        case ENOSYS:
            cout << "ENOSYS" << endl;
            break;
        }
    } else {
        cout << "Sent" << endl;
    }

    exit(1);
} else {
    //  Parent process
}

int status;
while (wait(&status) > 0) {
}

ssize_t size;
char* buf;
cout << mq_receive(mqdes, buf, 8, NULL) << endl;

switch (errno) {
case EAGAIN:
    cout << "EAGAIN" << endl;
    break;
case EBADF:
    cout << "EBADF" << endl;
    break;
case EMSGSIZE:
    cout << "EMSGSIZAE" << endl;
    break;
case EINTR:
    cout << "EINTR" << endl;
    break;
case ENOSYS:
    cout << "ENOSYS" << endl;
    break;
}

return 0;
}

En recibir impresiones -1 y EMSGSIZE ERRNO. ¿Qué ocurre?

Editar: estoy usando Fedora 15

¿Fue útil?

Solución

Desde el Página MQ_RECEIVE

EMSGSIZE] El tamaño del búfer de mensajes especificado, msg_len, es menor que el atributo de tamaño de mensaje de la cola de mensajes.

Lo más probable es que el búfer de mensajes sea demasiado pequeño para contener el mensaje completo.

char* buf;
cout << mq_receive(mqdes, buf, 8, NULL) << endl;

Debería ser algo como

char buf[1024];
cout << mq_receive(mqdes, buf, 1024, NULL) << endl;

También es una buena práctica para poner el valor predeterminado: en sus casos de conmutación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top