c信号处理程序以及setjmp函数longjmp函数的简单应用

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);
}

 

posted @ 2018-02-01 17:48  lan126  阅读(168)  评论(0编辑  收藏  举报