【发布时间】:2021-08-03 10:19:43
【问题描述】:
我正在尝试了解 Linux 中消息队列的工作原理。
最后,我想要一个程序,我可以在不同的线程/进程之间发送和接收东西,但首先,我只创建一个消息队列,并让它阻塞队列中的输入,但是mq_receive() 返回Message too long。
查看文档,这个错误表明`msg_len小于消息队列的mq_msgsize属性。但对我来说不是这样。
对不起,如果我遗漏了一些明显的东西,但我无法弄清楚。
#define MAX_MESSAGES 10
#define MAX_MSG_SIZE 256
#define MSG_BUFFER_SIZE MAX_MSG_SIZE + 10
int main()
{
mqd_t qd_server, qd_client;
char in_buffer [MSG_BUFFER_SIZE];
char out_buffer [MSG_BUFFER_SIZE];
struct mq_attr attr, tmpAttr;
attr.mq_flags = 0;
attr.mq_maxmsg = MAX_MESSAGES;
attr.mq_msgsize = MAX_MSG_SIZE;
attr.mq_curmsgs = 0;
if ((qd_server = mq_open ("/sp-example-server", O_RDONLY|O_CREAT, 0644, &attr)) == -1)
{
printf("%s\n", strerror(errno));
}
if (mq_getattr(qd_server, &tmpAttr) == -1)
{
printf("mq_getattr error");
}
printf("Maximum # of messages on queue: %ld\n", tmpAttr.mq_maxmsg);
printf("Maximum message size: %ld\n", tmpAttr.mq_msgsize);
int iret = mq_receive(qd_server, in_buffer, sizeof(in_buffer), NULL);
if (iret == -1)
{
printf("%s\n", strerror(errno));
}
return 0;
}
编辑:
运行mmq_getattr(qd_server, & tmpAttr) 后,似乎从未设置属性,这可能是原因。现在来看看为什么没有设置属性?
// output:
Maximum # of messages on queue: 10
Maximum message size: 8192
【问题讨论】:
-
您确定
mq_msgsize是您认为的那样吗?您没有打开队列 O_EXCLusively。mq_gettattr说什么? -
你是对的,值没有设置,但为什么会这样呢?如果没有
O_EXCL,它根本不会创建文件,所以不会填充qd_server? -
查找后,如果消息队列已经存在,看起来
O_EXCL在与O_CREAT一起使用时基本上会中止该功能,但在我的情况下,它是唯一创建的队列并且没有任何先前的 -
“从未设置属性”是什么意思?请向我们展示代码,向我们展示它们的值,并描述您如何知道它们的值是错误的。
-
您可以看到属性未设置为程序中设置的值
标签: c linux multithreading posix message-queue