mlockall(): невозможно выделить память

Я получаю сообщение об ошибке: ошибка mlockall: невозможно выделить память при вызове функции mlockall():

if(mlockall(MCL_CURRENT|MCL_FUTURE) == -1) {
            printf("mlockall failed: %m\n");
            exit(-2);
    }

Используемая среда IDE: ОС Eclipse: Ubuntu 16.04 Расширение реального времени с использованием: 4.11.12 rt-15 (упреждающий патч) Примечание. Я пытаюсь подключить UDP-СОЕДИНЕНИЕ в реальном времени (используя сетевой контроллер Intel i210).

Когда я отлаживаю то же самое в eclipse, это то, что показывает:

Не удается найти исходный файл в папке "/build/glibc-bfm8X4/glibc-2.23/misc/../sysdeps/unix/syscall-template.S" Найдите файл или отредактируйте путь поиска исходного кода, указав его местоположение.

Как это решить?


person inapathtolearn    schedule 27.10.2017    source источник
comment
У меня есть это: Can't find a source file at "/build/glibc-p3Km7c/glibc-2.24/io/../sysdeps/unix/syscall-template.S" Locate the file or edit the source lookup path to include its location. для другой проблемы, только когда я запускаю встроенную программу из IDE в режиме отладки. Из консоли работает. Так что, похоже, это связано только с конфигурацией IDE, а не с нашими приложениями.   -  person lalebarde    schedule 27.04.2018


Ответы (1)


Как объясняет 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

Так-то лучше. Если ваша программа не использует кучу памяти, это ограничение должно подойти - на самом деле в большинстве случаев этого более чем достаточно.

person Sam Nobs    schedule 22.03.2019