在CSAPP上看到的例子:
#include<iostream>
#include<signal.h>
#include <setjmp.h>
#include<unistd.h>
sigjmp_buf buf;
void handler(int sig){
std::cout << "hi\n";
siglongjmp(buf, 3);
}
int main(){
signal(SIGINT, handler);
if(!sigsetjmp(buf, 1))
std::cout << "starting\n";
else
std::cout << "restarting\n";
while(1){
sleep(1);
std::cout << "processing...\n";
}
}
代码简单,sigsetjmp设置一个点,当进程收到SIGINT信号即调用信号处理函数,调用siglongjmp返回sigsetjmp设置的点
因为次两个函数被认为风格不好,所以当时i没注意其原理。
其实背后的原理是:sigsetjmp把进程运行的上下文(栈帧,信号,环境变量等东西)保存在buf里,使得siglongjmp返回时可以在buf中回复进程的上下文。于是进程就“跳”到了sigsetjmp保存buf的点