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