学习unix高级编程之我见(持续更新中)
2013-09-11 13:56
190 查看
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函数跳转回,回复当时现场信息。
变量的保存需要注意,自动变量会丢失。
我会继续更新,这本书还在学习,希望大家随便拍砖。
在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函数跳转回,回复当时现场信息。
变量的保存需要注意,自动变量会丢失。
我会继续更新,这本书还在学习,希望大家随便拍砖。
相关文章推荐
- [持续更新] ERP学习资源
- iOS学习笔记总结二(持续更新)
- OpenGL学习记录(四)---函数库(持续更新)
- Hadoop学习笔记---持续更新中。。。
- 各种经典学习、技术、资料网站 (持续更新ing)
- Java学习笔记(持续更新)
- scala 学习笔记-持续更新中
- 学习资料汇总(会持续更新)
- Swift学习之小记(持续更新)
- EL表达式学习(持续更新)
- 计算机系统的初步学习(持续更新)--关于replace_byte()函数
- oracle学习 二(持续更新中)
- ruby学习笔记 -- 持续更新
- Shell脚本学习心得[持续更新]
- spring cloud学习资料~持续更新
- linux命令学习(持续更新....)
- Linux学习历程(持续更新整理中)
- Unity动画系统学习笔记(持续更新...)
- 【Python灰帽子--黑客与逆向工程师的Python编程之道】我的学习笔记,过程.(持续更新HOT)
- javascript小白学习指南4--持续更新