Я запускаю своего рода «песочницу» в C на Ubuntu: она берет программу и безопасно запускает ее под пользователем nobody
(и перехватывает сигналы и т. Д.). Кроме того, он назначает память и ограничения по времени, а также измеряет время и использование памяти.
(Если вам интересно, это своего рода «онлайн-судья», чтобы отмечать программы на тестовых данных)
В настоящее время я адаптировал модуль safeexec из mooshak . Хотя большинство вещей работает должным образом, использование памяти кажется проблемой. (Это очень неточно)
Теперь я попробовал совет здесь и проанализировал ВМ из /proc/pid/stat
, и теперь проблема с точностью устранена. Однако, для программ, которые завершаются очень быстро, это не работает и просто возвращает 0.
Программа safeexec работает следующим образом:
- Это
fork()
с
- Использует
execv()
в дочернем процессе для запуска нужной программы
- Контролирует программу из родительского процесса до тех пор, пока дочерний процесс не завершится (используя
wait4
, что возвращает использование ЦП, но не память?)
Таким образом, он анализирует /proc/../stat
дочернего процесса (который был заменен execv)
Так почему ВМ в /proc/child_pid/stat
иногда равна 0?
Это потому, что execv () завершается слишком быстро, а /proc/child_pid/stat
просто недоступен?
Если да, есть ли какой-нибудь другой способ получить использование памяти ребенком?
(Так как это предназначено для оценки программ с ограничением по времени, я не могу позволить себе что-то со снижением производительности, как valgrind)
Заранее спасибо.