1signal函数
在unix环境高级编程第十章的第一句就说信号就是软件中断,对于理解signal这个函数很重要。
void (*signal(int signum,void(* handler)(int)))(int);
这个函数看过去可能的时间是1s或者5s,但理解的不一定很精确。对于这个函数到底是这样写的网上很多,我就直接讲它的用途以及深刻含义。signum这个参数实际上就是软件中断置位,大家学过微机原理的就清楚,如果想要开中断,先要对哪个软件中断标志位进行置位,再在相应的中断处理函数中写中断发生时处理程序;后的handler这个参数,就是给的函数指针,实际上就是给的中断处理函数入口地址,以便软件中断发生时跳到中断处理程序中去。当然后面的函数指针还可以设置成另外两种格式SIG_IGN和SIG_DEF。还有一点就是后面函数指针还有一个int型参数,可以通过这个参数得到信号的值。
2setjmp和longjmp函数
这两个函数从字面意思就知道是跳转函数,但与goto语句不一样,他能实现跨函数的跳转,我就借用一个例子来说明吧,就来上代码
#include <stdio.h>
#include <setjmp.h>
jmp_buf jump_buffer;
void func(void)
{
printf("Before calling longjmp\n");
longjmp(jump_buffer, 1);
printf("After calling longjmp\n");
}
void func1(void)
{
printf("Before calling func\n");
func();
printf("After calling func\n");
}
int main()
{
if (setjmp(jump_buffer) == 0){
printf("first calling set_jmp\n");
func1();
}else {
printf("second calling set_jmp\n");
}
printf("after set\n");
printf("dljsou\n");
return 0;
}
按照这个代码执行,先打印 first calling set_jmp,然后执行到func1函数中,再跳到函数func中,当执行到longjmp(jump_buffer)时,跳到执行setjump函数处,判断为非零,执行else,再往下一直执行到程序结束。
从上面的执行过程,我们可以知道执行到longjmp函数时,已经嵌套了两层函数了,可知longjmp函数可以实现多层嵌套函数的调用。需要提醒
- 在执行longjmp函数前,必须要有setjmp函数,其实setjmp这个函数是将栈的信息记录记录在jmp_buffer中,以便longjmp函数跳转回,回复当时现场信息。
- 变量的保存需要注意,自动变量会丢失。
我会继续更新,这本书还在学习,希望大家随便拍砖。