我试图理解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
发布于 2021-08-03 02:19:43
您向我们展示的代码没有创建/sp-example-server
消息队列。
相反,一些先前的进程使用您为mq_maxmsg
和mq_msgsize
看到的值创建了该队列。如果队列创建者省略了属性规范--即将一个空struct mq_attr *
传递给mq_open
--那么实现将提供默认值。。在Linux上,这些默认值与您看到的值相匹配。。
似乎有些早期版本的代码名为mq_open
,具有空属性,因此O_CREAT使队列在您现在正在经历的过程中出现。
为了适应这种情况,您可以重新启动或mq_unlink
队列,迫使下一个对mq_open
的调用来重新创建它。更重要的是,当您不打开队列O_EXCLusively时,然后使用mq_getattr
验证队列的属性。
https://stackoverflow.com/questions/68627962
复制相似问题