sigaltstack ()-设置或获取信号备用堆栈上下文
标准
| 标准/扩展 | C 或 C++ | 依赖关系 |
|---|---|---|
XPG4.2
单一 UNIX 规范版本 3 |
两个 | POSIX(ON) |
格式
#define _XOPEN_SOURCE_EXTENDED 1
#include <signal.h>
int sigaltstack(const stack_t *__restrict__ ss, stack_t *__restrict__ oss);一般描述
sigaltstack () 函数允许线程为信号处理程序定义和检查备用堆栈的状态。 已显式声明要在备用堆栈上执行的信号将在备用堆栈上传递。
注: 要显式声明信号捕获器将在备用信号堆栈上运行,当使用 sigaction () 设置信号操作时,必须在 sa_flags 中设置 SA_ONSTACK 标志。
如果 ss 不是 NULL 指针,那么它将指向
stack_t 结构,该结构指定从 sigaltstack () 返回时生效的备用信号堆栈。 ss_flags 成员指定新的堆栈状态。 如果设置为 SS_DISABLE ,那么将禁用堆栈,并且将忽略 ss_sp 和 ss_size 。 否则,将启用堆栈,并且 ss_sp 和 ss_size 成员将指定堆栈的新地址和大小。AMODE 64 注意事项: 此堆栈的存储器必须高于 2GB 条形。 它可能不是通过 __malloc24() 或 __malloc31() 函数获取的存储器。
从 ss_sp开始的地址范围 (最多但不包括 ss_sp + ss_size) 可供实现用作堆栈。 此接口不会对堆栈基础是哪一端以及堆栈随着项的推送而增长的方向作出任何假定。
如果 oss 不是 NULL 指针,那么成功完成时,它将指向
stack_t 结构,该结构指定在调用 sigaltstack () 之前生效的备用信号堆栈。 ss_sp 和 ss_size 成员指定该堆栈的地址和大小。 ss_flags 成员指定堆栈的状态,并且可以包含下列其中一个值:- SS_ONSTACK
- 线程当前正在备用信号堆栈上执行。 当线程在其上执行时尝试修改备用信号堆栈失败。 此标志不得由线程修改。
- SS_DISABLE
- 当前已禁用备用信号堆栈。
值 SIGSTKSZ 是系统缺省值,指定在手动分配备用堆栈区域时将用于覆盖通常情况的字节数。 值 MINSIGSTKSZ 定义为信号处理程序的最小堆栈大小。 在计算备用信号堆栈大小时,程序应将该数量添加到其堆栈需求中,以允许系统实现开销。 The constants SS_ONSTACK, SS_DISABLE, SIGSTKSZ, and MINSIGSTKSZ are defined in <signal.h>.
成功调用其中一个 exec 函数后,新的进程映像中没有备用信号堆栈。
注:
- 如果使信号处理程序能够在备用堆栈上运行,那么必须使用相同的链接来编译该信号处理程序调用的所有函数。 例如,如果使用 XPLINK编译信号处理程序,那么它调用的所有函数也必须编译 XPLINK。 由于只能提供一个备用堆栈,因此不允许混合连接 (需要向上和向下生长的备用堆栈)。 创建的堆栈类型将基于要给予控制的信号处理程序的属性。 如果已使用 XPLINK编译信号处理程序,那么将在备用堆栈中创建向下生长的堆栈,包括在 AMODE 31 中使用用户堆栈中的足够存储空间来创建 4k 只读保护页 (在 4k 边界上对齐)。
- 如果在备用堆栈上运行信号处理程序时接收到新信号,并且该新信号指定了也在备用堆栈上运行的信号处理程序,那么必须使用相同的链接 (XPLINK 与非XPLINK) 编译这两个信号处理程序。
返回值
如果成功,那么 sigaltstack () 将返回 0。
如果不成功,sigaltstack() 返回 -1 并将 errno 设为以下值之一:
- 错误代码
- 描述
- EINVAL
- ss 参数不是 NULL 指针,并且 ss 指向的
ss_flags成员包含 SS_DISABLE 以外的标志。 - ENOMEM
- 备用堆栈区域的大小小于 MINSIGSTKSZ。
- EPERM
- 尝试修改活动堆栈。