与Stackoverflow的新徽标设计的庆祝活动保持一致,我很好奇sstk()
在BSD和其他类UNIX操作系统中应该是什么意思?
根据Linux内核系统调用接口联机帮助页,sstk(2)
应该是:
... [更改]堆栈区域的大小。堆栈区域也会根据需要自动扩展。在VAX上,文本和数据区域在P0区域中相邻,而堆栈部分在P1区域中,并向下增长。
但是,也根据手册:
可以注意到这一点4.3BSD或4.4BSD或glibc或Linux或任何其他已知类Unix系统不支持此调用。有些系统有一个这个名称的例程,它返回ENOSYS。
我的问题是,为什么要手动更改堆栈的大小? sbrk()和朋友有意义,但手动重新调整程序中的堆栈大小是否有用?
答案 0 :(得分:2)
正如我在评论中首次表达的那样,呼叫不受任何已知的支持这一事实表明事实上并没有多少意义,至少不再有这样的意义。
linux.die.net上的文档将函数的遗产归因于BSD(虽然它在现代BSD中显然不再支持其他任何地方),并且BSD将其谱系追溯到 bona fide AT& T Unix。在RAM很珍贵的日子里,它可能更有意义。在那些日子里,您也可能无法依赖自动增加的堆栈大小。因此,您可以在深度递归算法中动态扩大堆栈,然后将其缩回。
答案 1 :(得分:1)
使用系统调用显式增加堆栈的另一个合理的原因是,如果请求太大,您可以获得干净的错误指示,而不是处理堆栈分配失败的常规方法(即,甚至不均匀)尝试,如果任何分配失败,只要让进程崩溃)。
很难确切地知道执行某些递归操作需要多少堆栈空间,但是你可以做出合理的猜测,sstk(guess*10)
只是为了确定。