学习unix高级编程之我见(持续更新中)

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函数可以实现多层嵌套函数的调用。需要提醒

  1.   在执行longjmp函数前,必须要有setjmp函数,其实setjmp这个函数是将栈的信息记录记录在jmp_buffer中,以便longjmp函数跳转回,回复当时现场信息。
  2. 变量的保存需要注意,自动变量会丢失。

    我会继续更新,这本书还在学习,希望大家随便拍砖。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值