我在安装了 16 GB 内存的 ubuntu 13.04 64 位下使用英特尔编译器 14 工具链运行以下示例代码。
我有一个关于系统的问题(“做一些害羞的事..”)在我申请后无法工作 在某个点分配。 在解决这个问题几个小时后,我开始意识到我在那个特定点分配了 8GB 的内存这一事实不允许我进一步使用 system() 命令。
不用说,在我分配内存之前,我可以自由使用系统。
代码片段:
#include <string.h>
#include <iostream>
#include "stdlib.h"
int main() {
char ** buffer = new char*[100];
system("logger TRYING..!");
for(int i= 1; i<=80; i++)
{
buffer[i] = new char[200*1000*1000];
}
system("logger SUCCESS..!");
return 0;
}
感谢您的帮助...!
最佳答案
system
调用 fork
,这将本质上使您的进程所需的 RAM 翻倍。由于您使用的是 8 GB 而只有 16 GB,因此您没有足够的空间,并且 fork
失败。也就是说,fork
是通过写时复制页面实现的,这意味着如果您不更改子进程的内存,那么 RAM 实际上不会被复制。在这种情况下,您不会写入该内存,但操作系统不知道这一点,因此 fork
失败。您应该通过检查 system
的返回值来确认这一点(如果 fork
失败则为 -1)。
您可以尝试启用过度使用内存,这样您就可以“过度使用内存”。这应该让 fork
成功。对于您的情况,我可能只会临时启用它。
# Enable overcommit
echo 1 > /proc/sys/vm/overcommit_memory
# Disable overcommit
echo 0 > /proc/sys/vm/overcommit_memory
关于分配 8GB 内存后,C++ stdlib.h system() 命令将无法运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25624526/