Как ограничить объем памяти, который порожденная программа может использовать в C ++ - PullRequest
4 голосов
/ 26 апреля 2011

В моей программе на С ++ я собираюсь запустить другие программы.Если эти программы используют более определенного объема памяти, я хочу, чтобы моя программа убивала их процессы.Как это можно сделать?

Возможно, я буду использовать execv для запуска программ.

Ответы [ 3 ]

8 голосов
/ 26 апреля 2011

Предполагая, что вы работаете в системе POSIX, вы можете ограничить это, вызвав setrlimit(2) после fork(). Например:

if (fork() == 0) {
    struct rlimit limits;
    limits.rlim_cur = 10000000; // set data segment limit to 10MB
    limits.rlim_max = 10000000; // make sure the child can't increase it again
    setrlimit(RLIMIT_DATA, &limits);
    execv(...);
}

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

5 голосов
/ 26 апреля 2011

Читайте о функции setrlimit. Вы, вероятно, хотите что-то вроде:

#include <sys/resource.h>

struct rlimit limits;
limits.rlim_cur = // soft limit
limits.rlim_max = // hard limit
int err = setrlimit(RLIMIT_DATA, &limits);
if(err) ...

Предполагается, что вы пишете для Unix / Linux / BSD / Mac / и т. Д., А не для Windows ... что кажется правильным предположением, поскольку вы используете execv.

Пара замечаний: мягкий предел (rlim_cur) может уведомить процесс о превышении лимита. Превышение жесткого предела (rlim_max) приводит к сбою malloc(), устанавливая errno в ENOMEM, что обычно приводит к смерти процесса. Прочтите справочную страницу или попробуйте, чтобы увидеть, как она работает в вашей системе. Если стек превышает rlim_max, вы можете получить сигнал SIGSEGV.

Как правило, только корневой процесс может вызвать rlim_max. Обычный процесс может понизить rlim_max или установить rlim_cur на любое значение в диапазоне от 0 до rlim_max.

4 голосов
/ 26 апреля 2011

В Linux вы, вероятно, захотите использовать setrlimit .Не убивайте детей, хотя.Когда у них заканчивается память, они умирают сами по себе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...