gpt4 book ai didi

c - POSIX 消息队列,errno 90,消息太长

转载 作者:太空宇宙 更新时间:2023-11-04 10:36:54 25 4
gpt4 key购买 nike

我目前正在使用 POSIX 消息队列进行最小 IPC。我有一个管道只将 uint8_t 作为命令传递,另一个管道将传递长度最多为 128 个字符的字符串。命令管道工作正常。但是 stringpipe 总是给我 errno 90,这意味着 message too long。我写了一个最小的例子来演示这个问题(请注意:我保持最小,所以除了接收错误之外没有任何错误处理)。

#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h>
#include <errno.h>
#include <time.h>
#include <string.h>
#include <stdio.h>

int msg_size = 128;

int send()
{
struct mq_attr attr = {0, 10, msg_size + 1, 0};
mqd_t mq = mq_open("/test", O_RDWR | O_CREAT, 00644, &attr);
char msg[msg_size] = {0};
strncpy(msg, "this_is_a_test", msg_size);
mq_send(mq, msg, msg_size, 0);
}

int recv()
{
struct mq_attr attr = {0, 10, msg_size + 1, 0};
mqd_t mq = mq_open("/test", O_RDWR | O_CREAT, 00644, &attr);
char msg[msg_size] = {0};
int res = mq_receive(mq, msg, msg_size, NULL);
if (res == -1)
{
printf("Errno: %d\n", errno);
}
else
{
printf("Message: %s\n", msg);
}
}

int main()
{
send();
recv();
return 0;
}

编译:

g++ -o mq mq.c -lrt

最佳答案

如果您阅读 the mq_receive manual page你会看到 EMSGSIZE 意味着

msg_len was less than the mq_msgsize attribute of the message queue

[强调我的]

没错,您将 mq_msgsize 属性设置为 msg_size + 1 然后您收到 msg_size,它比 >mq_msgsize 属性。

设置mq_msgsize 属性时不需要+1,只需将其删除即可。

关于c - POSIX 消息队列,errno 90,消息太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36934002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com