Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在编写C程序时,如何设置内存使用限制?如果超过此限制,会发生什么情况?_C_Linux_Memory Management - Fatal编程技术网

在编写C程序时,如何设置内存使用限制?如果超过此限制,会发生什么情况?

在编写C程序时,如何设置内存使用限制?如果超过此限制,会发生什么情况?,c,linux,memory-management,C,Linux,Memory Management,我正在linux上编写一个C程序,我想知道: 如何限制我的c程序消耗的总内存 如果我给我的c程序设置了一个内存限制,比如32M,如果它需要比32M多得多的内存怎么办 请参阅系统中的ulimit命令 从man页面: -v The maximum amount of virtual memory available to the process 如果您的程序编写得很好,那么应该考虑动态内存分配失败的情况:检查malloc、calloc和realloc函数的返回值。在Linux上,在您的C程序中

我正在linux上编写一个C程序,我想知道:

  • 如何限制我的c程序消耗的总内存

  • 如果我给我的c程序设置了一个内存限制,比如32M,如果它需要比32M多得多的内存怎么办


  • 请参阅系统中的
    ulimit
    命令

    man
    页面:

    -v   The maximum amount of virtual memory available to the process
    

    如果您的程序编写得很好,那么应该考虑动态内存分配失败的情况:检查
    malloc
    calloc
    realloc
    函数的返回值。

    在Linux上,在您的C程序中,用于设置程序的执行环境限制。例如,当内存耗尽时,调用
    malloc()
    将返回NULL等

    #include <sys/resource.h>
    
    { struct rlimit rl = {32000, 32000}; setrlimit(RLIMIT_AS, &rl); }
    
    #包括
    {struct rlimit rl={32000,32000};setrlimit(rlimit_AS,&rl);}
    
    您应该使用setrlimit系统调用,使用RLIMIT_数据和RLIMIT_堆栈资源分别限制堆和堆栈大小。使用RLIMIT_AS或RLIMIT_RSS很有诱惑力,但您会发现它们在许多旧的Linux内核上无法可靠地工作,而且我在内核邮件列表上没有看到任何迹象表明这些问题已在最新的内核中得到解决。一个问题与mmap的内存如何计数有关,或者更确切地说,不计入限制总数。由于glibc malloc使用mmap进行大量分配,因此即使是不直接调用mmap的程序也可能超出限制


    如果超过RLIMIT_堆栈限制(调用堆栈太深,或在堆栈上分配太多变量),程序将收到SIGSEGV。如果您试图将数据段扩展到超过RLIMIT_数据限制(brk、sbrk或类似malloc的中介),则尝试将失败。brk或sbrk将返回<0,malloc将返回空指针。

    您对
    rl
    的初始化无效;它假定元素的特定顺序。您需要使用C99指定的初始值设定项,或者只是将名称作为独立语句分配给元素。当内存用完时,操作系统不会在磁盘上交换它们吗?@MickeyShine:这是一种非常不同的内存类型。你应该仔细阅读现代操作系统设计中的虚拟内存!:-)@R.:我从我的C++代码中解脱出来的。C中应该是什么?请随意编辑!编辑:我“修复”了它;-)如果结构碰巧有额外的成员,这仍然是无效的。有效值为:
    struct rlimit rl={.rlim_cur=32000,.rlim_max=32000}。。。还请注意
    struct
    关键字的必要性。在修正后尝试设置
    rlimit_stack
    ,可能会导致失败或相关问题。还可以看到红帽