Można ograniczyć wielkość pamięci wirtualnej procesu przy użyciu limitów systemowych. Jeśli przetwarzasz więcej niż ta kwota, zostanie zabity z sygnałem (myślę, że SIGBUS).
Można użyć coś takiego:
#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;
};
a następnie używać go tak:
RLimit dataLimit(RLIMIT_DATA);
dataLimit.set(128 * 1024); // in kB
clog << "soft: " << dataLimit.getCurrent() << " hard: " << dataLimit.getMax() << endl;
Implementacja ta wydaje się nieco rozwlekły, ale pozwala łatwo i czysto ustawić różne limity (patrz ulimit -a
).
Dlaczego nie wystarczy sprawdzić rozmiar pliku? –