不存在的sstk()系统调用的用法示例?

时间:2015-09-15 19:16:43

标签: c linux unix stack libc

与Stackoverflow的新徽标设计的庆祝活动保持一致,我很好奇sstk()在BSD和其他类UNIX操作系统中应该是什么意思?

根据Linux内核系统调用接口联机帮助页,sstk(2)应该是:

  

... [更改]堆栈区域的大小。堆栈区域也会根据需要自动扩展。在VAX上,文本和数据区域在P0区域中相邻,而堆栈部分在P1区域中,并向下增长。

但是,也根据手册:

  

4.3BSD或4.4BSD或glibc或Linux或任何其他已知类Unix系统不支持此调用。有些系统有一个这个名称的例程,它返回ENOSYS。

通过查看glibc's sstk.c source

可以注意到这一点

我的问题是,为什么要手动更改堆栈的大小? sbrk()和朋友有意义,但手动重新调整程序中的堆栈大小是否有用?

2 个答案:

答案 0 :(得分:2)

正如我在评论中首次表达的那样,呼叫不受任何已知的支持这一事实表明事实上并没有多少意义,至少不再有这样的意义。

linux.die.net上的文档将函数的遗产归因于BSD(虽然它在现代BSD中显然不再支持其他任何地方),并且BSD将其谱系追溯到 bona fide AT& T Unix。在RAM很珍贵的日子里,它可能更有意义。在那些日子里,您也可能无法依赖自动增加的堆栈大小。因此,您可以在深度递归算法中动态扩大堆栈,然后将其缩回。

答案 1 :(得分:1)

使用系统调用显式增加堆栈的另一个合理的原因是,如果请求太大,您可以获得干净的错误指示,而不是处理堆栈分配失败的常规方法(即,甚至不均匀)尝试,如果任何分配失败,只要让进程崩溃)。

很难确切地知道执行某些递归操作需要多少堆栈空间,但是你可以做出合理的猜测,sstk(guess*10)只是为了确定。