Я собираюсь преподавать вводный курс компьютерной науки в C, и я хотел бы продемонстрировать студентам, почему они должны проверить, вернул ли malloc() NULL. Мой план состоял в том, чтобы использовать ulimit
, чтобы ограничить объем доступной памяти, чтобы я мог использовать разные коды кода с разными ограничениями. Наша предписанная среда - CentOS 6.5.Вызов malloc() для возврата NULL на CentOS
Мои первые попытки сделать это не удались, и оболочка показала «Killed». Это привело к тому, что я обнаружил убийцу Linux OOM. С тех пор я попытался выяснить магический набор заклинаний, которые приведут к результатам, которые я ищу. Видимо, мне нужно возиться с:
/etc/sysctl.conf
ulimit -m
ulimit -v
vm.overcommit_memory
(который, видимо, должен быть установлен в 2, согласно статье Oracle)
это далеко либо Я получаю «Killed» или ошибку сегментации, ни один из которых не является ожидаемым результатом. Тот факт, что я получаю «Killed» с vm_overcommit_memory = 2, означает, что я определенно не понимаю, что происходит.
Если кто-то может найти способ искусственно и надежно создать ограниченную среду исполнения на CentOS, чтобы учащиеся научились обрабатывать типы ошибок OOM (и других?), Многие преподаватели курса будут вам благодарны.
'аннулируются * mymalloc (size_t п) {возвращение рандов()% 3? malloc (n): NULL; } 'then' #define malloc mymalloc' –
Вы пробовали лимит 'hard' в'/etc/security/limits.conf'? –
Мне очень нравится подход «случайного отказа», но я вижу, как некоторые ученики говорят: «Конечно, вы можете имитировать неудачу, но что происходит на самом деле?» Я планирую сделать некоторые демонстрации на Arduino (где malloc() лучше провалился), но хотел бы иметь возможность демонстрации в оболочке Linux. –