SIGRETURN - Linux手册页
Linux程序员手册 第2部分
更新日期: 2017-09-15
名称
sigreturn,rt_sigreturn-从信号处理程序和清除堆栈帧返回
语法
int sigreturn(...);
说明
如果Linux内核确定某个进程的未阻塞信号正在等待处理,则在该进程的下一次转换回到用户模式时(例如,从系统调用返回时或将该进程重新安排到CPU时),它将创建用户空间堆栈上的新帧,其中保存了各种过程上下文(处理器状态字,寄存器,信号掩码和信号堆栈设置)。
内核还安排,在转换回用户模式期间,将调用信号处理程序,并且在从处理程序返回时,控制权将传递给通常称为"信号蹦床"的一段用户空间代码。信号蹦床代码依次调用sigreturn()。
此sigreturn()调用撤消已完成的所有操作-更改过程的信号掩码,切换信号堆栈(请参见sigaltstack(2))-以调用信号处理程序。使用先前保存在用户空间堆栈中的信息sigreturn()可还原进程的信号掩码,切换堆栈并还原进程的上下文(处理器标志和寄存器,包括堆栈指针和指令指针),以便进程恢复在信号中断的地方执行。
返回值
sigreturn()永不返回。
遵循规范
许多UNIX类型的系统都有sigreturn()系统调用或近似的系统调用。但是,此调用未在POSIX中指定,并且其行为的详细信息在系统之间有所不同。
备注
sigreturn()仅用于允许信号处理程序的实现。永远不要直接调用它。 (实际上,GNU C库中的简单sigreturn()包装器只返回-1,而errno设置为ENOSYS。)传递给sigreturn()的参数的详细信息(如果有)取决于体系结构。 (在某些架构上,例如x86-64,sigreturn()不带任何参数,因为它所需的所有信息在内核先前在用户空间堆栈上创建的堆栈帧中都可用。)
曾几何时,UNIX系统将蹦床代码放到用户堆栈上。如今,用户堆栈的页面受到保护,以禁止执行代码。因此,在现代Linux系统上,取决于体系结构,信号蹦床代码位于vdso(7)或C库中。在后一种情况下,C库的sigaction(2)包装函数通过将其地址放在sigaction结构的sa_restorer字段中来向内核通知蹦床代码的位置,并在sa_flags字段中设置SA_RESTORER标志。
保存的流程上下文信息放置在ucontext_t结构中(请参阅参考资料)。该结构在信号处理程序中可见,作为通过sigaction(2)与SA_SIGINFO标志建立的处理程序的第三个参数。
在其他一些UNIX系统上,信号蹦床的操作略有不同。特别是,在某些系统上,在转换回用户模式后,内核将控制权交给蹦床(而不是信号处理程序),并且蹦床代码调用信号处理程序(一旦处理程序返回,则调用sigreturn())。
C library/kernel differences
最初的Linux系统调用名为sigreturn()。但是,通过在Linux 2.2中添加实时信号,添加了一个新的系统调用rt_sigreturn()以支持扩展的sigset_t类型。 GNU C库向我们隐藏了这些细节,在内核提供时会透明地使用rt_sigreturn()。
另外参见
kill(2),restart_syscall(2),sigaltstack(2),signal(2),getcontext(3),signal(7),vdso(7)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。