首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mqueue:消息太长

mqueue:消息太长
EN

Stack Overflow用户
提问于 2013-09-01 10:43:56
回答 2查看 2.9K关注 1票数 0

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

这是消息来源:

代码语言:javascript
复制
#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);
}   

这是一个输出:

代码语言:javascript
复制
opening mqueue: Success
receiving: Message too long
message: 

/**new edit**/

好的,我修改了代码,以便更好地消除一些歧义。

代码语言:javascript
复制
#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;
}   

输出

代码语言:javascript
复制
receiving: Message too long
message: 
unlink() failed: No such file or directory
EN

回答 2

Stack Overflow用户

发布于 2013-09-01 11:30:22

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

如果错误条件被解释,则只有errno 携带显着值,通常是通过返回指示失败的特定值的函数表示

您可能希望将代码修改为如下所示:

代码语言:javascript
复制
#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;
}   
票数 1
EN

Stack Overflow用户

发布于 2013-09-01 10:50:24

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

更改:

代码语言:javascript
复制
mq_receive(mq, buffer, strlen(buffer), NULL);

至:

代码语言:javascript
复制
mq_receive(mq, buffer, SIZE, NULL);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18557622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档