什么是“ulimit -s unlimited”呢?

堆栈分配上有很多相关的问题是可以理解的

什么和堆栈和堆在哪里?

为什么堆栈大小有限制?

堆栈和堆内存的大小

但是,在各种* nix机器上,我可以发出bash命令

ulimit -s unlimited 

或csh命令

 set stacksize unlimited 

这如何改变程序的执行方式? 对程序或系统性能有什么影响(例如,为什么这不是默认的)?

如果有更多的系统细节是相关的,我主要关心在x86_64硬件上运行的Linux上使用GCC编译的程序。

Solutions Collecting From Web of "什么是“ulimit -s unlimited”呢?"

这将有点迂腐,你可能已经知道一些,所以忍受我。 当你在程序中声明变量时,内核为它们的数据在栈中分配空间。 你可以告诉内核限制任何给定程序可以使用的堆栈(或堆)的多少空间,这样一个程序不能占用整个堆栈。 如果程序可以使用的堆栈的数量没有限制,那么通常会导致程序崩溃的错误会导致整个系统崩溃。 内核崩溃的程序高于分配的堆栈空间称为“堆栈溢出”。

堆栈中最常见的错误之一是过度递归或无限递归。 由于每次对函数的新调用都会导致其所有变量都被放置在堆栈上,所以非尾优化的递归程序可能会迅速耗尽由内核分配给进程的堆栈空间。 例如,这个无限递归函数一旦超出了分配的堆栈空间就会导致内核崩溃:

 int smash_the_stack(int number) { smash_the_stack(number + 1); return 0; } 

传统的堆栈空间传统上是一件非常可怕的事情,因为它可以被用于“堆栈粉碎”或堆栈缓冲区溢出的情况。 当恶意用户故意导致堆栈溢出来改变堆栈指针来执行自己的任意指令而不是自己的代码中的指令时,就会发生这种情况。

就表现而言,不应有任何影响。 如果你通过递归来达到堆栈限制,那么堆栈大小可能不是最好的解决方案,但是否则你不应该担心。 如果一个程序绝对必须存储大量的数据,它可以使用堆。

Mea Culpa,堆栈大小确实可以是无限的。 _STK_LIM默认值_STK_LIM_MAX每个架构_STK_LIM_MAX所不同,从include/asm-generic/resource.h可以看出:

 /* * RLIMIT_STACK default maximum - some architectures override it: */ #ifndef _STK_LIM_MAX # define _STK_LIM_MAX RLIM_INFINITY #endif 

从这个例子可以看出,通用值是无限的,其中RLIM_INFINITY又是一般情况下定义为:

 /* * SuS says limits have to be unsigned. * Which makes a ton more sense anyway. * * Some architectures override this (for compatibility reasons): */ #ifndef RLIM_INFINITY # define RLIM_INFINITY (~0UL) #endif 

所以我猜想真正的答案是 – 堆栈大小可以被某些架构限制,那么无限的堆栈跟踪将意味着无论_STK_LIM_MAX被定义_STK_LIM_MAX ,并且万一它是无穷大的,则它是无限的。 有关将其设置为无限的含义以及可能具有的含义的详细信息,请参阅另一个答案,这比我的要好。

“ulimit -s unlimited”可以让堆栈无限增长。 如果你用递归编写程序,这可能会阻止你的程序崩溃,特别是如果你的程序不是递归的(编译器可以“优化”那些程序),递归的深度很大。

@Maxwell Hansen的答案几乎包含了这个问题的正确答案。 然而,它被埋在了大量虚假的声明中 – 请参阅评论。 因此,我觉得有义务写这个答案。