Bạn có thể giới hạn kích thước bộ nhớ ảo của quy trình của bạn bằng cách sử dụng giới hạn hệ thống. Nếu bạn xử lý vượt quá số tiền này, nó sẽ bị giết với một tín hiệu (SIGBUS tôi nghĩ).
Bạn có thể sử dụng một cái gì đó như:
#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;
};
Và sau đó sử dụng nó như thế:
RLimit dataLimit(RLIMIT_DATA);
dataLimit.set(128 * 1024); // in kB
clog << "soft: " << dataLimit.getCurrent() << " hard: " << dataLimit.getMax() << endl;
thực hiện này có vẻ hơi dài dòng nhưng nó cho phép bạn dễ dàng và sạch sẽ thiết lập giới hạn khác nhau (xem ulimit -a
).
Nguồn
2018-01-24 16:05:06
Tại sao không chỉ kiểm tra kích thước của tệp? –