有没有办法轻松地将C / C ++应用程序限制到指定的内存量(30 MB左右)?例如:如果我的应用程序试图完成将50mb文件加载到内存中,它将死/打印消息并退出/等。
不可否认,我可以不断检查应用程序的内存使用情况,但如果我超过它就会因为错误而死亡会更容易一些。
有什么想法吗?
平台不是一个大问题,windows / linux /无论编译器。
答案 0 :(得分:10)
阅读unix系统上ulimit
的手册页。有一个内置的shell,您可以在启动可执行文件之前调用,或者(在手册的第3部分中)调用相同名称的API调用。
答案 1 :(得分:7)
在Windows上,您无法直接为进程的内存使用量设置配额。但是,您可以创建Windows作业对象,设置作业对象的配额,然后将该过程分配给该作业对象。
答案 2 :(得分:5)
在bash中,使用ulimit builtin:
bash$ ulimit -v 30000
bash$ ./my_program
-v需要1K块。
<强>更新强>
如果您想在应用中进行设置,请使用setrlimit。请注意,ulimit(3)
的手册页明确表示它已过时。
答案 3 :(得分:4)
覆盖所有malloc API,并为new / delete提供处理程序,以便您可以预订内存使用情况并在需要时抛出异常。
不确定这是否比通过OS提供的API进行内存监控更容易/省力。
答案 4 :(得分:2)
您可以使用系统限制限制流程虚拟内存的大小。如果你的处理超过这个数量,它将被一个信号杀死(我认为是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
)。