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

Usage example of the nonexistent sstk() system call?

为了庆祝 Whosebug 的新徽标设计,我很好奇 sstk() 在 BSD 和其他类 UNIX 操作系统中的意义何在?

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

...[change] the size of the stack area. The stack area is also automatically extended as needed. On the VAX the text and data areas are adjacent in the P0 region, while the stack section is in the P1 region, and grows downward.

不过,也是按照手册:

This call is not supported in 4.3BSD or 4.4BSD or glibc or Linux or any other known Unix-like system. Some systems have a routine of this name that returns ENOSYS.

通过查看可以注意到glibc's sstk.c source

我的问题是,为什么要手动更改堆栈的大小? sbrk() 和朋友们说得通,但是在你的程序中手动重新调整 堆栈大小 有什么用吗?

正如我最初在评论中表达的那样,调用在任何已知位置均不受支持这一事实表明,事实上它没有太多意义,至少不再是意义所在。

linux.die.net 上的文档将该函数的继承归因于 BSD(尽管现代 BSD 显然不支持它,就像其他任何地方一样),BSD 将其血统追溯到 bona fide 美国电话电报公司 Unix。在 RAM 非常宝贵的日子里,这可能更有意义。在那些日子里,您也可能无法依赖自动增加堆栈大小。因此,比如说,您可以在深度递归算法中动态扩大堆栈,然后再将其缩小。

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

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