Question

Je suis en train d'envoyer un message « test » avec mqueue, mais le message de réception échoue avec EMSGSIZE. Code:

#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;
}

Sur réception il imprime -1 et errno EMSGSIZE. Quel est le problème?

EDIT: J'utilise Fedora 15

Était-ce utile?

La solution

de la page mq_receive

[EMSGSIZE] La taille du tampon de message spécifié, msg_len, est inférieure à l'attribut de taille de message de la file d'attente de message.

Très probablement le tampon de message est trop petit pour contenir le message complet.

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

devrait être quelque chose comme

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

Aussi est bon de mettre par défaut:. Dans votre cas de commutation

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top