结构消息太长错误 mq_send
Message too long error mq_send with struct
我正在尝试设置消息队列 IPC 示例。
问题: 我正在尝试制作一个工作测试用例,其中我使用 mqueue 发送一个 struct 具有各种字段(我是引用 this post)。但是,我运行变成了Message too long错误。大多数示例发送一个 char* 消息,但我想发送一个包含多个字段的结构。在这个玩具示例中,它只有一个文件路径,但我也想将其他字段添加到结构中,并通过消息队列发送结构。
工作示例:
#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h> // mq_open(), mq_send(), mq_receive()
//#include <errno.h>
//#include <time.h>
#include <string.h> // strncpy(), strlen()
#include <stdio.h> // printf(), perror()
#include <stdlib.h> // exit(), EXIT_FAILURE
#define MSG_SIZE (300)
static mqd_t mqdes = -1;
static struct mq_attr attr;
typedef struct{
char filepath[MSG_SIZE];
} obj;
void sendQueue()
{
obj obj1;
strncpy(obj1.filepath, "this_is_a_test", MSG_SIZE);
if( -1 == mq_send(mqdes, (const char *) &obj1, sizeof(obj1), 0) )
{
perror( "mq_send failed" );
exit( EXIT_FAILURE );
}
else
{
printf("msg sent successfully");
}
}
void recvQueue()
{
obj recv_obj;
ssize_t res = mq_receive(mqdes, (char*) &recv_obj, sizeof(recv_obj), NULL);
if (res == -1)
{
perror("mq_receive failed");
}
else
{
printf("Message: %s\n", recv_obj.filepath);
}
}
int main( void )
{
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
memset( &attr, 0x00, sizeof(struct mq_attr) );
attr.mq_flags = 0;
attr.mq_maxmsg = 10;
attr.mq_msgsize = 1024;
attr.mq_curmsgs = 0;
char *queueName = "/test";
mqdes = mq_open( queueName, O_RDWR|O_CREAT, mode, &attr);
if( -1 == mqdes )
{
perror( "mq_open failed");
exit( EXIT_FAILURE );
}
// implied else, mq_open successful
sendQueue();
recvQueue();
return 0;
}
用
编译
gcc -std=gnu99 test.c -lrt -o test
在 linux 18.04.3 LTS 上。
mq_receive 中的第三个参数应该是 1024 而不是发送的消息的大小。
根据 mq_receive 的手册页
"The msg_len argument specifies the size of the buffer pointed to by msg_ptr; this must be greater than or equal to the mq_msgsize attribute of the queue (see mq_getattr(3))."
我正在尝试设置消息队列 IPC 示例。
问题: 我正在尝试制作一个工作测试用例,其中我使用 mqueue 发送一个 struct 具有各种字段(我是引用 this post)。但是,我运行变成了Message too long错误。大多数示例发送一个 char* 消息,但我想发送一个包含多个字段的结构。在这个玩具示例中,它只有一个文件路径,但我也想将其他字段添加到结构中,并通过消息队列发送结构。
工作示例:
#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h> // mq_open(), mq_send(), mq_receive()
//#include <errno.h>
//#include <time.h>
#include <string.h> // strncpy(), strlen()
#include <stdio.h> // printf(), perror()
#include <stdlib.h> // exit(), EXIT_FAILURE
#define MSG_SIZE (300)
static mqd_t mqdes = -1;
static struct mq_attr attr;
typedef struct{
char filepath[MSG_SIZE];
} obj;
void sendQueue()
{
obj obj1;
strncpy(obj1.filepath, "this_is_a_test", MSG_SIZE);
if( -1 == mq_send(mqdes, (const char *) &obj1, sizeof(obj1), 0) )
{
perror( "mq_send failed" );
exit( EXIT_FAILURE );
}
else
{
printf("msg sent successfully");
}
}
void recvQueue()
{
obj recv_obj;
ssize_t res = mq_receive(mqdes, (char*) &recv_obj, sizeof(recv_obj), NULL);
if (res == -1)
{
perror("mq_receive failed");
}
else
{
printf("Message: %s\n", recv_obj.filepath);
}
}
int main( void )
{
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
memset( &attr, 0x00, sizeof(struct mq_attr) );
attr.mq_flags = 0;
attr.mq_maxmsg = 10;
attr.mq_msgsize = 1024;
attr.mq_curmsgs = 0;
char *queueName = "/test";
mqdes = mq_open( queueName, O_RDWR|O_CREAT, mode, &attr);
if( -1 == mqdes )
{
perror( "mq_open failed");
exit( EXIT_FAILURE );
}
// implied else, mq_open successful
sendQueue();
recvQueue();
return 0;
}
用
编译gcc -std=gnu99 test.c -lrt -o test
在 linux 18.04.3 LTS 上。
mq_receive 中的第三个参数应该是 1024 而不是发送的消息的大小。 根据 mq_receive 的手册页 "The msg_len argument specifies the size of the buffer pointed to by msg_ptr; this must be greater than or equal to the mq_msgsize attribute of the queue (see mq_getattr(3))."