setrlimit 和 limit stack 的行为之间的差异

setrlimit 和 limit stack 的行为之间的差异

从 shell 和 C 程序内部设置堆栈大小时,我发现行为有所不同。问题是我有一个具有大量局部变量(大数组)的函数。

如果我执行以下操作

limit stack 256000

我的 c 程序继续运行,没有失败,但内部的相同值在函数调用时崩溃

在调用该函数之前, main 的前几行如下 -

struct rlimit lim = {256000*1024, 256000*1024};
int x=setrlimit(RLIMIT_STACK, &lim);
if(x!=0) {
    printf("Error in setrlimit);
}

setrlimit 没有发出错误。

除此之外,它似乎是特定于某些平台(SuSE 11)的,并且不会在所有操作系统上发生。

如何确保程序增加的堆栈大小有效?另一件事是,即使我在 setrlimit 中放入巨大的值,也没有效果。

答案1

setrlimit(RLIMIT_STACK) 的应用方式是特定于平台的并且差异很大。

如果您想要确保增加进程的限制,最好的方法是在进程启动之前在 shell 中设置它(正如您在问题中指出的那样),因为从那时起,无论发生什么情况,它都会被应用您的进程是否是线程化的,或者您的平台所遵循的实现的具体细节是什么。

相关内容