当我们想要在信号处理函数中跳转时,可以使用sigsetjmp,siglongjmp来让信号处理函数实现跳转,看例子:
#include<stdio.h>
#include<setjmp.h>
#include<signal.h>
#include<unistd.h>
jmp_buf env;
#define ENV_SAVED 1
#define ENV_UNSAVED 0
int flag_envsaved = ENV_UNSAVED;
void sighandler_MIN15()
{
if(flag_envsaved==ENV_UNSAVED)
return;
printf("singhandler_MIN15 runing/n");
longjmp(env,1);
}
int main()
{
switch(sigsetjmp(env,1))
{
case 0:
printf("SIGRTMAX-15=%d ,SIGRTMIN+15=%d/n",SIGRTMAX-15,SIGRTMIN+15);
flag_envsaved = ENV_SAVED;
break;
case 1:
printf("recive signal SIGMIN+15/n");
default:
break;
}
signal(SIGRTMIN+15,sighandler_MIN15);
while(1)pause();
return 0;
}
编译后执行,在另外一个中端中用ps -a来查看该进程的pid,然后用 kill -s 49 pid来给这个进程发送信号,观察输出。