如何在Mac OS X上使用ulimit或每个进程为C或Ruby程序更改堆栈大小?

nop*_*ole 17 c ruby stack ulimit

似乎为C程序或Ruby程序(使用C堆栈)设置堆栈大小的推荐方法是ulimit在Bash shell中使用.但

$ ulimit -s
8192

$ ulimit -s 16384
-bash: ulimit: stack size: cannot modify limit: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

sudo没有帮助.有没有办法将其设置为16MB,32MB或64MB?我认为应该有一种方法来设置每个程序调用,而不是设置系统范围的参数?

现在8192可能意味着8MB这是非常小的,如果将其与进程可以使用的数量进行比较,有时甚至高达2GB的RAM.

(更新的注释: ulimit -a可以显示其当前值).

(更新2:它实际上似乎ulimit -s <value>是每个shell,如果你第一次设置它,它通常会工作.问题是当你第二次设置它,然后它可能会返回一个错误)

Sam*_*lar 11

显然,对于mac os x的堆栈大小有一个硬性限制,取自http://lists.apple.com/archives/scitech/2004/Oct/msg00124.html,这是非常古老的,我不确定它是否是仍然是真的,但设置它只是调用ulimit -s hard,它的65532.或大约65 megs.

我对雪豹进行了一些测试,10.6.8,看起来确实如此.

$ ulimit -a
...
stack size              (kbytes, -s) 8192
...
$ ulimit -s 65533
-bash: ulimit: stack size: cannot modify limit: Operation not permitted
$ ulimit -s 65532
$
Run Code Online (Sandbox Code Playgroud)

我也发现了这个http://linuxtoosx.blogspot.com/2010/10/stack-overflow-increasing-stack-limit.html虽然我还没有测试过,所以不能真正说出来.

当应用程序消耗通常从堆中获取的内存时,堆栈通常为本地自动变量保留,这些变量存在的时间相当于函数调用的生命周期,堆是大多数持久数据存在的地方.

这是一个快速教程:

#include <stdlib.h>

#define NUMBER_OF_BYTES 10000000 // about 10 megs
void test()
{
   char stack_data[NUMBER_OF_BYTES];          // allocating on the stack.
   char *heap_data = malloc(NUMBER_OF_BYTES); // pointer (heap_data) lives on the stack, the actual data lives on the heap.
}

int main()
{   
    test(); 
    // at this point stack_data[NUMBER_OF_BYTES] and *heap_data have being removed, but malloc(NUMBER_OF_BYTES) persists.
    // depending on the calling convention either main or test are responssible for resetting the stack.
    // on most compilers including gcc, the caller (main) is responssible.

    return 0;
}

$ ulimit -a
...
stack size              (kbytes, -s) 8192
...
$ gcc m.c
$ ./a.out
Segmentation fault
$ ulimit -s hard
$ ./a.out
$
Run Code Online (Sandbox Code Playgroud)

ulimit只是暂时的,您每次都必须更新它,或更新相应的bash脚本以自动设置它.

一旦设置了ulimit,它只能降低从不升高.


小智 6

在我看来,接受的答案并不完全正确,会导致误解,更具体地说,最后一句话是不正确的。

设置 ulimit 后,它只能降低永远不会升高。

确实有软(可以用ulimit -s或显示ulimit -Ss)和硬(可以用 显示ulimit -Hs)限制。但是通过设置限制ulimit -s会影响软值硬值。

一旦设置了限制,它只能降低永远不会提高,但只要值保持低于硬限制,就可以降低或提高软限制。

这将起作用:

# base values
$ ulimit -s
100
$ ulimit -Hs
100
$ ulimit -Ss
100
# lower soft limit only
$ ulimit -Ss 50
$ ulimit -s
50
$ ulimit -Hs
100
$ ulimit -Ss
50
# raise soft limit only
$ ulimit -Ss 100
$ ulimit -s
100
$ ulimit -Hs
100
$ ulimit -Ss
100
# lower soft and hard limit
$ ulimit -s 50
$ ulimit -s
50
$ ulimit -Hs
50
$ ulimit -Ss
50
# then impossible to raise soft limit due to hard limit
$ ulimit -s 100
-bash: ulimit: stack size: cannot modify limit: Operation not permitted
$ ulimit -Ss 100
-bash: ulimit: stack size: cannot modify limit: Invalid argument
Run Code Online (Sandbox Code Playgroud)