sigaction中的SA_ONSTACK有什么用途?

9

当信号被传递时,信号处理程序在进程的堆栈上执行。 如果在sigaction()中使用了SA_ONSTACK,则使用不同的堆栈。

使用不同的堆栈有什么用?有哪些使用案例示例?

2个回答

21

备用堆栈的一个用途是尝试正确处理 SIGSEGV 信号。

如果您的进程因为超出了其堆栈限制而刚刚接收到一个 SIGSEGV 信号,那么您无法在该进程的堆栈上运行信号处理程序 - 它已经满了。拥有备用堆栈允许您在这种情况下(小心谨慎地)运行一些更为优雅的关闭程序。


1
+1 这正是 TLPI 提到的 sigaltstack 的示例。 - cnicutar

9
另一个有趣的例子是将“普通”的编程语言(例如C语言)与使用小堆栈和/或分离堆栈的其他语言运行时链接,例如Go语言。
在Go中,轻量级线程(goroutine)具有相对较小的堆栈,需要按需扩展。基本上,每个函数的前导部分检查堆栈是否还有足够的空间,如果没有则会增加堆栈。
当Go通过cgo调用C代码时,它会自动扩展堆栈以满足C的期望。
然而,如果C代码安装了信号处理程序,则可能会在任何时候调用它们,包括没有足够的堆栈空间时。
因此,任何与Go代码链接的C代码必须使用SA_ONSTACK以避免崩溃。

https://golang.org/pkg/os/signal/#hdr-Go_programs_that_use_cgo_or_SWIG


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接