3

我在创建 mqueue 时遇到问题,即我的系统似乎阻止我创建超过 5 个 mqueue,即使 /proc/sys/fs/mqueue/queues_max 设置为 256。我正在运行 Ubuntu 13.04 服务器上带有 Atom E680T 的 Q7 模块系统,我还在运行自定义编译内核 (3.8.0) 以减小内核大小并添加默认情况下缺少的看门狗和 i2c 访问。

我已经检查以确保通过安装 mqueue 接口只使用了 5 个 mqueue,在创建 5 个之后它不会让我创建第 6 个,返回“打开的文件太多”。错误。为了确保函数调用没有问题,我删除了一个现有队列并再次运行我的程序,它成功地创建了队列。

我目前不知所措,我能找到的信息表明 /proc/sys/fs/mqueue/queues_max 应该控制限制,并且默认为 256。但是修改该文件夹中的这个或任何其他文件并没有出现帮助。

因此,如果有人能指出我的正确方向,我将不胜感激,在大多数情况下,mqueue 是通过以下变体创建的:

    mq_attr attribs;
//initialise the incoming message queue.
printLog ("I2C MANAGER: Registering mqueue.\n");
// Set attributes for main message queue
attribs.mq_maxmsg = 512;
attribs.mq_msgsize = sizeof(t_io_message);
attribs.mq_flags=0;
// Create the queue
in_queue = mq_open(I2C_MQUEUE, O_RDONLY|O_CREAT, 0666, &attribs);
// Check queue was successfully created
if (-1 == in_queue)
{
    printLogf ("I2C MANAGER: Error unable to register mqueue /i2c-manager: %s.\n", strerror(errno));
    exit(1);
}
else
{
    printLog ("I2C MANAGER: Mqueue Initialisation succesfull.\n");
}
4

1 回答 1

3

我解决了,错误消息具有误导性,并不是我打开了太多 mqueue,而是 mqueue 为这些自身分配了大部分分配给 mqueue 系统的内存。因此,当我尝试打开一个新的 mqueue 时,它​​无法获得足够的内存并且无法打开。

查看其他进程的代码,我应该能够通过减少 maxmsg 值来释放空间。有些使用 1000 的队列大小,上面我从另一个进程复制粘贴的一个设置为 512 条消息,这似乎非常过分。通过在两个进程中将该值减半进行了快速测试,现在我的第 6 个队列正在运行。

于 2013-05-30T10:36:42.570 回答