У меня проблема с созданием 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");
}
Я решил это, сообщение об ошибке вводило в заблуждение, не то, чтобы у меня было слишком много открытых mqueues, это было то, что mqueues выделили для себя большую часть памяти, выделенной системе mqueue. Поэтому, когда я пытался открыть новый mqueue, он не мог получить достаточно памяти для него и не смог открыть.
Глядя на код для других процессов, я смогу освободить место, просто уменьшив значение maxmsg. Некоторые используют очереди размером 1000, вышеописанная копия, вставленная из другого процесса, настроена на 512 сообщений, что кажется очень чрезмерным. Сделал быстрый тест, вдвое уменьшив это значение в двух процессах, и теперь у меня запущена шестая очередь.
Других решений пока нет …