如何使用的ulimit或每个进程在Mac OS X为C或Ruby程序来改变堆栈大小?(How to

2019-06-18 21:48发布

似乎建议的方式来设置的堆栈大小为一个C程序或Ruby程序(它使用C堆栈),是通过使用ulimit在Bash壳。 但

$ ulimit -s
8192

$ ulimit -s 16384
-bash: ulimit: stack size: cannot modify limit: Operation not permitted

sudo也没有帮助。 有没有办法将其设置为16MB,32MB,64MB或? 我想应该有设置每个程序调用,而不是设置一个系统级参数,以及一种方式?

眼下8192大概意思是8MB如果被比较的过程有多少可以使用这是相当小的,有时高达2GB的RAM。

更新注: ulimit -a可以显示当前的值)。

更新2:它实际上似乎像ulimit -s <value> 。为每壳,并且,如果将其设置在第一时间,它通常工作问题是,当将其设置在第二时间,则可能返回一个错误)

Answer 1:

显然有针对Mac OS X的,取自堆栈大小的硬性限制http://lists.apple.com/archives/scitech/2004/Oct/msg00124.html授予这是很老了,如果林不知道它的尚真了,但设置它简单地调用的ulimit -s硬,其65532.或约65兆。

我做了雪豹,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
$

我也发现了这个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
$

的ulimit只是暂时的,你必须每次更新或更新相应的bash脚本来自动设置。

一旦ulimit设置它只能降低从未提出。



Answer 2:

系统默认的堆栈大小不同版本的内核到内核的变化。 我10.7 16384,这样的ulimit -s 16384是我的Mac接受。 您可以尝试sysctl kern.stack_size ,它显示只读堆栈大小。 我的是16384。
你可以看到这个技术文章, http://developer.apple.com/library/mac/#qa/qa1419/_index.html ,看看如何改变对C程序的默认堆栈大小。 对于红宝石,因为它是一个脚本语言,你有链接的Ruby解释器中扩大其堆栈大小。 除外具有非常深的函数调用或递归,或者具有非常大的阵列和在堆栈中被分配的对象,你的程序应该不会有巨大的堆栈空间。 相反,如你所愿使用堆或动态分配最多可以使用2GB的RAM。



Answer 3:

在我看来,接受的答案是不完全正确的,并导致错过理解,更具体的最后一条语句是不正确的。

一旦ulimit设置它只能降低从未提出。

确实有软(可显示用ulimit -sulimit -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


Answer 4:

我发现,使用/bin/zsh不是/bin/sh使这个错误消失。

对我来说,错误发生在shell脚本中调用ulimit -s unlimited 。 当脚本被解释/bin/sh (即有#!/bin/sh作为脚本文件的第一行),它barfed与此错误。 相比之下,改变其使用时zsh ,一切似乎正常工作。 zsh很聪明,诠释unlimited的“给我最大的极限操作系统将让我有”,并且一切都按你想要它。



文章来源: How to change the stack size using ulimit or per process on Mac OS X for a C or Ruby program?