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

Это результат:

opening mqueue: Success
receiving: Message too long
message: 

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

хорошо, я изменил код для лучшего устранения неопределенности

#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

2 ответа

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

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

Вы можете изменить свой код на что-то вроде этого:

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

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

Изменить:

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

чтобы:

mq_receive(mq, buffer, SIZE, NULL);
Другие вопросы по тегам