mlockall(): невозможно выделить память
Я получаю сообщение об ошибке: mlockall не удалось: не удается выделить память при вызове функции mlockall():
if(mlockall(MCL_CURRENT|MCL_FUTURE) == -1) {
printf("mlockall failed: %m\n");
exit(-2);
}
Используемая среда IDE: Eclipse OS: Ubuntu 16.04 Расширение в реальном времени с использованием: 4.11.12 rt-15 (исправленный патч) Примечание: я пытаюсь установить UDP-соединение в реальном времени (используя контроллер Intel i210 ethernet).
Когда я отлаживаю то же самое в затмении, это то, что показывает:
Не удается найти исходный файл в "/build/glibc-bfm8X4/glibc-2.23/misc/../sysdeps/unix/syscall-template.S" Найдите файл или отредактируйте исходный путь поиска, чтобы указать его местоположение.
Как это решить?
0 ответов
Как объясняет man 2 mlockall, у вас, похоже, нет прав для блокировки объема памяти, который вы пытались заблокировать. Вы можете либо отрегулировать этот лимит, либо попробовать запустить программу от имени пользователя root, например, через sudo
, Я не рекомендую делать последнее для чего-то другого, кроме как выяснить, действительно ли проблема в ограничениях, так что вот как настроить ограничения для bash на Kubuntu - это может работать по-другому на вашем дистрибутиве.
Сначала посмотрим, каков ваш лимит:
$ ulimit -a | grep locked
max locked memory (kbytes, -l) 64
64 килобайта это не много! Для этого тоже есть сокращение:
$ ulimit -l
64
Скорее всего, вы не сможете легко настроить лимит:
$ ulimit -l 1000000
bash: ulimit: max locked memory: cannot modify limit: Operation not permitted
И даже если бы вы были, это не сохранялось бы при вызовах оболочки, перезагрузках и т. Д. Поэтому нам нужен другой подход.
/etc/security/limits.conf
в помощь! Это файл, значения по умолчанию для пределов которого считываются при запуске сеанса пользователя - см. Man 5 limit.conf.
Добавьте следующую строку (nobss
мое имя пользователя, вы должны использовать свой, очевидно)
nobss - memlock 1000000
в файл, чтобы установить жесткие и мягкие ограничения в 1000000 кбайт. Выйдите и войдите, и вуаля:
$ $ ulimit -l
1000000
Так-то лучше. Если ваша программа не использует кучи памяти, это ограничение должно подойти - на самом деле этого более чем достаточно в большинстве случаев.