【问题标题】:mqueue: message too longmqueue:消息太长
【发布时间】:2013-09-04 15:24:40
【问题描述】:

当我运行以下程序时,我总是收到错误消息“消息太长”。为什么?

这是来源:

#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

【问题讨论】:

  • 除非您知道发生了错误,否则不应检查 errno。测试mq_receive返回值。
  • 它是-1,所以有一个错误:(
  • 您希望收到什么消息?也许它非常大?尽量提供更完整的数据。
  • OT:我是int main()

标签: c mqueue


【解决方案1】:

您正在记录errno,但不确定它是否已设置。

errno only 带有重要值如果错误条件被明确指出,否则,通常由函数返回一个特定值来指示它失败。

您可能希望将您的代码修改为如下内容:

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

【讨论】:

    【解决方案2】:

    buffer 未初始化,因此strlen(buffer) 将返回一些不确定的值。

    变化:

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

    到:

    mq_receive(mq, buffer, SIZE, NULL);
    

    【讨论】:

    • OK - 可能还有更多错误 - 在调用 mq_open 后立即检查 mq 的值 - 如果它是 -1 则失败。
    • @AlessandroMariani:但是strlen(buffer) 肯定是错误的,好像缓冲区将被初始化为所有0s,strlen(buffer) 将返回0,这肯定不是你的想要。
    猜你喜欢
    • 2011-08-03
    • 1970-01-01
    • 2022-06-15
    • 2017-04-20
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2021-03-21
    • 2016-06-03
    相关资源
    最近更新 更多