È possibile limitare la dimensione della memoria virtuale del processo utilizzando i limiti del sistema. Se il processo supera questa quantità, verrà ucciso con un segnale (penso SIGBUS).
Si può usare qualcosa di simile a:
#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;
};
e quindi utilizzarlo come quella:
RLimit dataLimit(RLIMIT_DATA);
dataLimit.set(128 * 1024); // in kB
clog << "soft: " << dataLimit.getCurrent() << " hard: " << dataLimit.getMax() << endl;
Questa implementazione sembra un po 'prolisso, ma li lascia facilmente e in modo pulito impostare limiti diversi (vedi ulimit -a
).
fonte
2018-01-24 16:05:06
Perché non basta controllare la dimensione del file? –