《深入理解计算机系统》第八章 (五)非本地跳转 setjmp longjmp

原创 2013年12月04日 19:01:32
/* $begin restart */
#include "csapp.h"

sigjmp_buf buf;

void handler(int sig)
{
    siglongjmp(buf, 1);
}

int main()
{
    Signal(SIGINT, handler);

    if (!sigsetjmp(buf, 1))
    printf("starting\n");
    else
    printf("restarting\n");

    while(1) {
    Sleep(1);
    printf("processing...\n");
    }
    exit(0);
}
/* $end restart */

setjmp函数

#include <setjmp.h>

int setjmp(jmp_buf env);

int sigsetjmp(sigjmp_buf env, int savesigs);

setjmp函数在env缓冲区中保存当前调用环境,以供后面的longjmp使用,并返回0。调用环境包括程序计数器、栈指针和通用目的寄存器。


longjmp函数

 #include <setjmp.h>

void longjmp(jmp_buf env, int val);

void siglongjmp(sigjmp_buf env, int val);

longjmp函数从env缓冲区中恢复调用环境,然后触发一个从最近一次初始化env的setjmp调用的返回。


核心要点:

setjmp函数之被调用一次,但返回多次,一次是当第一次调用setjmp,而调用环境保存在缓冲区env中时;一次是为每个相应的longjmp调用。

longjmp函数被调用一次,但从不返回。


非本地返回的意义:

非本地返回的一个重要意义在于允许从一个深层嵌套的函数中立即返回,而不用费力解开调用栈。


例程分析:

setjmp在第一次被调用的时候返回0 ,打印出”starting“

之后如果按下ctrl+c就会发送SIGINT信号,进程接收到该信号后就会调用信号处理程序,信号处理程序执行longjmp,触发setjmp返回,返回值为val,即为1,则进程打印输出restarting。之后继续跳入while循环。

setjmp/longjmp非局部跳转函数分析

之前就一直好奇setjmp()/longjmp()函数是怎么实现非局部跳转的,心中猜测应该是通过保存调用setjmp()函数处的栈上下文(stack context),之后通过函数longjmp()来...

setjmp longjmp 非局部跳转

http://www.cnblogs.com/lienhua34/archive/2012/04/22/2464859.html
  • Sins_Cj
  • Sins_Cj
  • 2016年01月12日 10:42
  • 285

非局部跳转函数 setjmp 和 longjmp

1. 非局部跳转函数 - setjmp 和 longjmp 函数    非局部指的是,这不是由普通C语言goto语句在一个函数内实施的跳转,而是在栈上跳过若干调用帧,    返回到当前函数调用路径...

setjmp与longjmp非局部跳转函数的使用

[root@bogon code]# cat c.c #include #include static jmp_buf env;//定义全局变量env void job() { longjmp...

非本地跳转函数setjmp,longjmp, sigsetjmp, siglongjmp

非本地跳转 一种用户级的异常控制流形式。将控制直接从一个函数转移到另一个当前正在执行的函数。不需要正常的调用-返回序列(入栈--出栈)  (ps: 系统调用 为异常中陷阱的主要表现形式,参数都是通过...

使用setjmp()和longjmp()执行非局部跳转

1.简述库函数setjmp和longjmp可以实现跳转到当前执行函数之外的某个位置,虽然此功能就像goto语句一样使程序不好维护,但是当一个深度嵌套的函数中发生了错误,需要放弃当前任务,从多层函数调用...

setjmp和longjmp的"非本地跳转"

C语言中要实现"非本地跳转",C标准函数库提供了2个函数setjmp和longjmp来实现这个功能。头文件在。setjmp/longjmp的典型用途是例外处理机制的实现:利用longjmp恢复程序或线...

C语言的非局部跳转:setjmp和longjmp

C语言中有一个goto语句,其可以结合标号实现函数内部的任意跳转(通常情况下,很多人都建议不要使用goto语句,因为采用goto语句后,代码维护工作量加大)。另外,C语言标准中还提供一种非局部跳转“n...

setjmp和longjmp的"非本地跳转"

C语言中要实现"非本地跳转",C标准函数库提供了2个函数setjmp和longjmp来实现这个功能。头文件在。setjmp/longjmp的典型用途是例外处理机制的实现:利用longjmp恢复程序或线...
  • ruglcc
  • ruglcc
  • 2012年08月30日 15:08
  • 635

浅析C语言的非局部跳转:setjmp和longjmp

C语言中有一个goto语句,其可以结合标号实现函数内部的任意跳转(通常情况下,很多人都建议不要使用goto语句,因为采用goto语句后,代码维护工作量加大)。另外,C语言标准中还提供一种非局部跳转“n...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《深入理解计算机系统》第八章 (五)非本地跳转 setjmp longjmp
举报原因:
原因补充:

(最多只允许输入30个字)