1.利用signal函数注册一个信号处理函数handler当收到相应的信号时,不终止程序而是给出友好的提示信息,这里对一个空指针赋值会产生一个segment violation错误
被hanler函数捕捉后通过s的值得到相应的提示
#include <signal.h> #include <stdio.h> #include <stdlib.h> void handler(int s) { if(s == SIGBUS) printf("now got a bus error signal\n"); if(s == SIGSEGV) printf("now got a segmention violation signal\n"); if(s == SIGILL) printf("now got an illegal instruction signal\n"); exit(1); } int main() { int *p=NULL; signal(SIGBUS,handler); signal(SIGSEGV,handler); signal(SIGILL,handler); *p=0; }
2.利用longjmp和setjmp实现接受一个信号后重启一个进程
注册一个型号处理函数
1.用setjmp函数保存当前执行时的上下文保存在buf中并返回0
2.进入死循环
3.给出一个SIGINT信号,longjmp函数执行恢复buf保存的上下文并返回一个数这里是1
4.又回到了main函数并且if为真
#include <setjmp.h> #include <signal.h> #include <stdio.h> jmp_buf buf; void handler(int s) { if(s == SIGINT) printf("now got a SIGINT signal\n"); longjmp(buf,1); /*没有到达*/ } int main() { signal(SIGINT,handler); if(setjmp(buf)) { printf("back in main\n"); return 0; }else { printf("first time through\n"); } while(1); }
转载于:https://www.cnblogs.com/tclan126/p/8400301.html
相关资源:数据结构—成绩单生成器