Невозможно создать более 5 Mqueues
У меня проблема с созданием mqueues, а именно моя система блокирует мне создание более 5 mqueues, хотя для /proc/sys/fs/mqueue/queues_max установлено значение 256. Я использую сервер Ubuntu 13.04 на модульная система Q7 с Atom E680T, я также использую собственное скомпилированное ядро (3.8.0), чтобы уменьшить размер ядра и добавить сторожевой таймер и доступ к i2c, который отсутствовал по умолчанию.
Я проверил, чтобы убедиться, что только 5 mqueues используются при монтировании интерфейса 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");
}
1 ответ
Я решил это, сообщение об ошибке вводило в заблуждение, не то, чтобы у меня было слишком много открытых mqueues, это было то, что mqueues выделили для себя большую часть памяти, выделенной системе mqueue. Поэтому, когда я пытался открыть новый mqueue, он не мог получить достаточно памяти для него и не смог открыть.
Глядя на код для других процессов, я смогу освободить место, просто уменьшив значение maxmsg. Некоторые используют размер очереди в 1000, вышеописанная копия, вставленная из другого процесса, настроена на 512 сообщений, что кажется очень чрезмерным. Провел быстрый тест, вдвое уменьшив это значение в двух процессах, и теперь у меня запущена 6-я очередь.