我遇到创建mqueues的问题,即我的系统似乎阻止我创建超过5个队列,即使/ 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.但修改该文件夹中的这个或任何其他文件不会不能帮忙。
所以,如果有人能指出我正确的方向,这个限制可能会在哪里,我将不胜感激,因为大多数情况下,mqueues正在被创造出来的变化:
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");
}
答案 0 :(得分:2)
我解决了这个问题,错误消息是误导性的,并不是因为我打开了太多的mqueues,而是mqueues为这些自我分配了大部分分配给mqueue系统的内存。因此,当我尝试打开一个新的mqueue时,它无法获得足够的内存并且无法打开。
查看其他进程的代码,我应该能够通过减少maxmsg值来释放空间。有些正在使用1000的队列大小,上面的一个我从另一个进程粘贴的副本被设置为512条消息,这看起来非常过分。通过在两个进程中将该值减半来进行快速测试,现在我已经运行了第6个队列。