【问题标题】:How to limit available memory to make `malloc()` fail?如何限制可用内存以使“malloc()”失败?
【发布时间】:2019-02-12 22:21:27
【问题描述】:

我想通过限制可用内存使malloc() 失败。

$ ulimit -v 1000
$ ./main.exe 10000000
0x102bfb000

但即使使用 ulimit,以下程序仍然可以正确完成。有人知道如何让malloc() 失败吗?谢谢。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    size_t size = atoi(argv[1]);
    void *ptr = NULL;

    if((ptr = malloc(size)) == NULL) {
        perror("malloc()");
        exit(1);
    }

    printf("%p\n", ptr);
    free(ptr);
    return 0;
}

编辑:以上是在 Mac OS X 上。

在 Linux 上,我遇到了分段错误。为什么malloc() 会导致分段错误?如何让malloc()返回一个NULL指针?

【问题讨论】:

  • 你想要 -m 不是吗? -v 只是限制虚拟内存
  • ulimit -Sm 1 仍然不会对realloc() 造成任何问题。
  • 你在什么操作系统上使用什么外壳?如果我在 Linux 4.15 上对 dash、bash 和 fish 执行 ulimit -v 1 操作,几乎任何东西都会因为分配失败而中断,甚至在设法启动程序之前。对于其余的 ulimit -v 具有较大值的工作在我的机器上按预期工作 - 请记住,ulimit -v 以 KiB 为单位,而您的程序以字节为单位。
  • 我在 Mac OS X 上使用 bash。当调用 ulimit -v 1 时,没有任何中断。我不确定出了什么问题。

标签: c memory malloc ulimit


【解决方案1】:

根据文档: 如果 ptr 是空指针,该函数的行为类似于 malloc,分配一个新的 size 字节块并返回一个指向其开头的指针

如果你想限制程序可以分配的内存,你可以使用:

#include <sys/time.h>
#include <sys/resource.h>
rlimit l;
getrlimit(RLIMIT_AS, &l);
l.rlim_cur = 1000;
setrlimit(RLIMIT_AS, &l);

http://man7.org/linux/man-pages/man2/setrlimit.2.html

【讨论】:

  • 我的问题是如何让realloc() 失败。我不认为你的回答能解决我的问题。
  • 我编辑了我的答案来回答你的问题。但是根据您的代码,您应该将 realloc 更改为 malloc 并更改问题的标题。因为你想分配内存失败而不是重新分配。
  • @MichałMarszałek 我很高兴知道如何限制它——我过去一直想知道这一点。只是出于好奇,你知道为什么 ulimit 不阻止它工作吗?
  • 这适用于 Linux。但同样对 Mac OS X 没有影响。@MichałMarszałek 为什么 ulimit 在 Mac 上不起作用以及为什么它会在 Linux 上导致段错误?
【解决方案2】:

1MB 的内存限制不足以达到实际的 malloc 调用。在我的 linux 系统上,libc 是 2MB。所以 1MB 的内存不足以完全加载应用程序,甚至到达 main 函数。

对我来说,使用ulimit -v 5000 足以打印malloc(): Cannot allocate memory 消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2023-03-30
    相关资源
    最近更新 更多