Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C MQUE:消息太长_C_Mqueue - Fatal编程技术网

C MQUE:消息太长

C MQUE:消息太长,c,mqueue,C,Mqueue,当我运行以下程序时,我总是收到错误消息“message too long”。为什么? 这是来源: #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

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

这是来源:

#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

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

更改:

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


您正在记录
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;
}   

除非知道发生了错误,否则不应检查
errno
。测试
mq_receive
返回值。它是-1,因此出现了一个错误:(您希望接收什么消息?可能它非常大?尝试提供更完整的数据。OT:它是
int main()
。好的-可能还有更多的错误-在调用
mq\u open
后立即检查
mq
的值-如果是-1,则失败。@AlessandroMariani:但是
strlen(buffer)
存在明显错误,好像缓冲区将被初始化为所有
0
s,
strlen(buffer)
将返回
0
,这肯定不是您想要的。
#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;
}