gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:34:45 24 4
gpt4 key购买 nike

似乎为 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> 似乎是每个 shell,如果您第一次设置它,它通常会起作用。问题是当您第二次设置它时,那么它可能会返回一个错误)

最佳答案

显然,mac os x 的堆栈大小有硬性限制,摘自 http://lists.apple.com/archives/scitech/2004/Oct/msg00124.html当然这已经很老了,我不确定它是否仍然正确,但要设置它只需调用 ulimit -s hard,它是 65532。或大约 65 兆。

我在 snow leopard 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虽然我还没有测试过,所以不能说太多。

当应用程序消耗通常从堆中获取的 gig 内存时,堆栈通常是为局部自动变量保留的,这些变量存在的时间相对较短,相当于函数调用的生命周期,堆是大部分持久的数据生命。

这是一个快速教程:

#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,它就只能降低而不能提高。

关于c - 如何在 Mac OS X 上使用 ulimit 或每个进程为 C 或 Ruby 程序更改堆栈大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13245019/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com