当传递信号时,信号处理程序在进程的堆栈上执行。
如果在sigaction()
中使用SA_ONSTACK,则使用不同的堆栈。
使用不同堆栈有什么用?任何用例示例?
答案 0 :(得分:15)
备用堆栈的一个用途是尝试正确处理SIGSEGV
。
如果您的进程刚收到SIGSEGV
,因为它超出了堆栈限制,则无法在进程堆栈上运行信号处理程序 - 它已经已满。在这种情况下,使用备用堆栈可以(小心地)运行一些或多或少的正常关闭。
答案 1 :(得分:5)
另一个有趣的例子是当您将“普通”代码(如C)与使用拆分堆栈的其他语言运行库(如Go语言)链接时。
在Go中,goroutines(轻量级线程)具有相当小的堆栈,可根据需要进行扩展。基本上,每个函数的序言都会检查堆栈是否有足够的空间,如果没有,则会增加堆栈。
当Go通过cgo调用C代码时,它会自动扩展堆栈以满足C期望。
但是,如果C代码安装了信号处理程序,则可能随时调用它们,包括当没有足够的堆栈空间时。
因此,任何与Go代码链接的C代码都必须使用SA_ONSTACK
才能崩溃。
https://golang.org/pkg/os/signal/#hdr-Go_programs_that_use_cgo_or_SWIG