SA_ONSTACK在sigaction中有什么用?

时间:2012-03-03 16:00:47

标签: c linux signals

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

使用不同堆栈有什么用?任何用例示例?

2 个答案:

答案 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