最近在 lug 看到有人发了这 paper
http://xmailserver.org/rse-pmt.pdf
大概原理是:
1. 把 函数指针 放在全局变量
2. 在 signal handler 里面用 setjmp 保存 context
3. sigreturn 后 longjmp 回去
4. 回到了 signal handler 的上下文,调用步骤 1 的 routine
优点
1. 可以移植性非常好
缺点
1. 创建上下为比较复杂,按照论文的说法,会比 makecontext 慢 15 倍
2. signal handling 过程会在 signal stack 上保留一些信息,导致栈空间浪费
3. 某些系统 longjmp 会误判 我们在跳转到一个已经退出的 stack 而触发错误(论文说法是控制流回交给一个 error handler )