Linux的信号栈的实现(1)

本文通过一个测试程序分析Linux系统中多线程环境下,信号处理函数如何使用栈。当主线程和线程收到SIGUSR1信号时,发现信号处理函数都在各自线程的用户栈上执行。在主线程和线程1、2中,信号处理函数的栈回溯显示返回地址为__kernel_rt_sigreturn,并揭示了信号处理后的返回流程。Linux还提供sigaltstack系统调用以设置独立的信号栈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者

[email protected]

环境

Linux 6.5 + ARM64

概述

前一篇文章中介绍了Linux系统中的几种栈以及它们之间的切换,进程在用户态和内核态会使用不同的栈,在用户态的主线程和其他线程都有各自的栈,此外进程在执行信号处理程序时也需要栈,那么这个栈来自哪呢?

正文

我们还是以一个多线程的用户态可执行程序为例,先看现象,然后再结合Linux内核源码分析实现。

测试程序

介绍一下这个测试程序multi_thread_signal.c,在主线程里给SIGUSR1注册了处理函数,函数的实现很简单,主要就是打印当前的调用栈。然后主线程又创建了两个从线程,此时存在3个线程,这3个线程分别调用各自的func1、func2和func3,最后在func3中进入sleep,目的是方便我们观察调用栈。

#include