Искусственное ограничение использования памяти C / C ++ - PullRequest
14 голосов
/ 23 сентября 2010

Есть ли способ легко ограничить приложение C / C ++ определенным объемом памяти (30 МБ или около того)?Например: если мое приложение попытается завершить загрузку 50 МБ файла в память, оно умрет / напечатает сообщение и завершит работу / etc.

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

Есть идеи?

Платформа не является большой проблемой, Windows / Linux / любой компилятор.

Ответы [ 5 ]

10 голосов
/ 23 сентября 2010

Прочтите страницу руководства для ulimit в системах Unix. Существует встроенная оболочка, которую вы можете вызвать до запуска вашего исполняемого файла или (в разделе 3 руководства) вызова API с тем же именем.

7 голосов
/ 23 сентября 2010

В Windows вы не можете установить квоту для использования памяти процессом напрямую.Однако вы можете создать объект задания Windows, установить квоту для объекта задания и затем назначить процесс этому объекту задания.

5 голосов
/ 23 сентября 2010

В bash, используйте встроенную ulimit :

bash$ ulimit -v 30000
bash$ ./my_program

-v занимает 1 Кбайт блоков.

Если вы хотите установить это из своего приложения, используйте setrlimit .Обратите внимание, что в справочной странице для ulimit(3) явно сказано, что она устарела.

4 голосов
/ 23 сентября 2010

Переопределите все API-интерфейсы malloc и предоставьте обработчики для нового / удаления, чтобы можно было сохранять память и генерировать исключения при необходимости.

Не уверен, что это даже проще / экономит усилия, чем простоосуществлять мониторинг памяти через предоставляемые ОС API.

2 голосов
/ 24 января 2018

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

Вы можете использовать что-то вроде:

#include <sys/resource.h>
#include <iostream>

using namespace std;

class RLimit {
public:
    RLimit(int cmd) : mCmd(cmd) {
    }

    void set(rlim_t value) {
        clog << "Setting " << mCmd << " to " << value << endl;
        struct rlimit rlim;
        rlim.rlim_cur = value;
        rlim.rlim_max = value;
        int ret = setrlimit(mCmd, &rlim);
        if (ret) {
            clog << "Error setting rlimit" << endl;
        }
    }

    rlim_t getCurrent() {
        struct rlimit rlim = {0, 0};
        if (getrlimit(mCmd, &rlim)) {
            clog << "Error in getrlimit" << endl;
            return 0;
        }
        return rlim.rlim_cur;
    }
    rlim_t getMax() {
        struct rlimit rlim = {0, 0};
        if (getrlimit(mCmd, &rlim)) {
            clog << "Error in getrlimit" << endl;
            return 0;
        }
        return rlim.rlim_max;
    }

private:
    int mCmd;
};

И затем использовать это так:

RLimit dataLimit(RLIMIT_DATA);
dataLimit.set(128 * 1024 );  // in kB
clog << "soft: " << dataLimit.getCurrent() << " hard: " << dataLimit.getMax() << endl;

Эта реализация кажется несколько многословной, но позволяет легко и чистоустановить разные пределы (см. ulimit -a).

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