2013-09-01 5 views
0

Когда я запускаю следующую программу, у меня всегда появляется сообщение об ошибке «Message too long». Зачем?mqueue: сообщение слишком долго

это источник:

#define NAME "/q" 
#define SIZE 16 

void main() 
{ 
mqd_t mq; 
char buffer[SIZE+1]; 
struct mq_attr attr; 

attr.mq_flags = 0; 
attr.mq_maxmsg = 10; 
attr.mq_msgsize = SIZE; 
attr.mq_curmsgs = 0; 

mq = mq_open(NAME, O_CREAT | O_RDWR, 0644, &attr); 
printf ("opening mqueue: %s\n", strerror(errno)); 

mq_receive(mq, buffer, strlen(buffer), NULL); 
printf ("receiving: %s\n", strerror(errno)); 

printf ("message: %s\n", buffer); 

unlink(NAME); 
} 

Это outupt:

opening mqueue: Success 
receiving: Message too long 
message: 

/** новый редактировать **/

okok я изменил код лучше устранить некоторую двусмысленность

#define NAME "/q" 
#define SIZE 1024 

int main() 
{ 
    mqd_t mq; 
    char buffer[SIZE+1] = {0}; 
    struct mq_attr attr = {0}; 

    attr.mq_flags = 0; 
    attr.mq_maxmsg = 10; 
    attr.mq_msgsize = SIZE; 
    attr.mq_curmsgs = 0; 

    if ((mqd_t) -1 == (mq = mq_open(NAME, O_CREAT | O_RDWR, 0644, &attr))) 
    printf("opening mqueue: %s\n", strerror(errno)); 

    if (-1 == mq_receive(mq, buffer, SIZE+1, NULL)) 
    printf("receiving: %s\n", strerror(errno)); 

    printf("message: %s\n", buffer); 

    if (-1 == unlink(NAME)) 
    perror("unlink() failed"); 

    return 0; 
} 

выход

receiving: Message too long 
message: 
unlink() failed: No such file or directory 
+1

Вы не должны исследовать 'errno', если вы не знаете, произошла ошибка. Проверьте возвращаемое значение 'mq_receive'. – ugoren

+0

Это -1, есть ошибка :( –

+0

Какое сообщение вы ожидаете получить? Возможно, это очень большой? Попробуйте предоставить более полные данные. – ugoren

ответ

0

buffer является неиницализированным, так strlen(buffer) возвратит некоторое неопределенное значение.

Изменение:

mq_receive(mq, buffer, strlen(buffer), NULL); 

к:

mq_receive(mq, buffer, SIZE, NULL); 
+0

ОК, но это не так, t change, я также попробовал SIZE + 1, но ничего. –

+0

OK - возможно, есть больше ошибок - проверьте значение 'mq' сразу после вызова' mq_open' - если это -1, то это не удалось. –

+1

@AlessandroMariani: Однако 'strlen (buffer)' существует определенно неправильно, как если бы буфер был инициализирован для всех '0' s, 'strlen (buffer)' возвращал '0', что, конечно же, не то, что вы хотите. – alk

1

Вы регистрируетесь errno, не будучи уверенным, что он был установлен.

errnoтолько несет значительную величину , если условие ошибки было указано expliclty в противном случае, как правило, с помощью функции, возвращающей specfic значение, указывающее, что не удалось.

Вы хотели бы изменить код, чтобы что-то вроде этого:

#define NAME "/q" 
#define SIZE 16 

int main() 
{ 
    mqd_t mq = ; 
    char buffer[SIZE+1] = {0}; 
    struct mq_attr attr = {0}; 

    attr.mq_flags = 0; 
    attr.mq_maxmsg = 10; 
    attr.mq_msgsize = SIZE; 
    attr.mq_curmsgs = 0; 

    if ((mqd_t) -1 == (mq = mq_open(NAME, O_CREAT | O_RDWR, 0644, &attr))) 
    printf("opening mqueue: %s\n", strerror(errno)); 

    if (-1 == mq_receive(mq, buffer, sizeof(buffer), NULL)) 
    printf("receiving: %s\n", strerror(errno)); 

    printf("message: %s\n", buffer); 

    if (-1 == unlink(NAME)) 
    perror("unlink() failed"); /* easier varaint of printf ("...: %s\n", strerror(errno));, also prints to stderr, where errors should go. */ 

    return 0; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^