分配 8GB 内存后,C++ stdlib.h system() 命令将无法运行

标签 c++ linux system std ubuntu-13.04

我在安装了 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/

相关文章:

c++ - 如何将用 C++ 编写的 Qt4 小部件实现到一些 Python 代码中?

c++ - 当 cin 和 cout 解开时使用 std::endl vs "\n"

c++ - 在没有 friend 的情况下授予对基类的 protected 访问权限

c - makecontext 函数中的指针说明

c - 向 Minix 添加打印父进程 ID 系统调用

c++ - 在 massif 工具中跟踪子进程的命令

c++ - 静态成员有不同的值

linux - 在shell脚本中并行运行ssh并设置远程变量

java - 如何在迭代的某个点中断循环并检查系统打印了什么?

linux - 在 initramfs 中使用 perl 重定向系统调用的输出