SA_ONSTACK在sigaction中有什么用途?

SA_ONSTACK在sigaction中有什么用途?,c,linux,signals,C,Linux,Signals,当传递信号时,信号处理程序在进程堆栈上执行。 如果在sigaction()中使用sau ONSTACK,则使用不同的堆栈 使用不同的堆栈有什么用?任何用例示例?备用堆栈的一个用途是尝试正确处理SIGSEGV 如果您的进程刚刚收到一个SIGSEGV,因为它超出了堆栈限制,那么您无法在进程的堆栈上运行信号处理程序-它已经满了。在这种情况下,有一个备用堆栈可以(小心地)运行一些或多或少优雅的关闭。另一个有趣的例子是,当您将“普通”代码(如C)与其他使用拆分堆栈的语言运行库(如Go语言)链接时 在Go中

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


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

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


如果您的进程刚刚收到一个
SIGSEGV
,因为它超出了堆栈限制,那么您无法在进程的堆栈上运行信号处理程序-它已经满了。在这种情况下,有一个备用堆栈可以(小心地)运行一些或多或少优雅的关闭。

另一个有趣的例子是,当您将“普通”代码(如C)与其他使用拆分堆栈的语言运行库(如Go语言)链接时

在Go中,goroutines(轻量级线程)具有相当小的堆栈,可以根据需要进行扩展。基本上,每个函数的序言都会检查堆栈是否有足够的空间,如果没有,则会增长堆栈

当Go通过cgo调用C代码时,它会自动扩展堆栈以满足C的期望

然而,如果C代码安装了信号处理程序,它们可能会在任何时候被调用,包括当没有足够的堆栈空间时

因此,任何与Go代码链接的C代码都必须使用
sau ONSTACK
,以避免崩溃


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