#include <setjmp.h>
int setjmp(jmp_buf env );
返回值:若直接调用返回0,若从longjmp调用返回则返回非0值;
int longjmp(jmp_buf env , int val);
//jmp_buf是一个特殊类型,是某种特殊的数组,其中存放调用longjmp时能用来恢复桟的所有信息。
//env设为全局变量
setjmp和longjmp:执行跳转(处理发生深层嵌套函数调用中出错情况很有用)
与goto的区别:
goto:在一个函数内实施跳转。
setjmp和longjmp(非局部goto):在桟上跳过若干调用帧,返回到当前函数调用路径上。
要编写一个使用非局部挑战的可移植的程序时要使用volatile属性,才能使变量仍存放在寄存器中。但是将一个系统移植到另一个系统什么都可能改变。
#include"apue.h"
#include<serjmp.h>
#define TOK_ADD 5
jmp_buf jmpbuffer;
void do_line(char *);
void cmd_add(void);
void get_token(void);
int main(void)
{
char line[MAXLINE];
if(setjmp(jmpbuffer)!=0)
printf("error");
while(fgets(line,MAXLINE,stdin) != NULL)
do_line(line);
exit(0);
}
char *tok_ptr;
void do_line(char *ptr)
{
int cmd;
tok_ptr = ptr;
while((cmd = get_token()) > 0)
{
switch (cmd){
case TOK_ADD:
cmd_add();
break;
}
}
}
void cmd_add(void)
{
int token;
token = get_token();
if(token < 0)
longjmp(jmpbuffer,1);
}
int get_token(void)
{}
Unix环境高级编程第七章7.10学习总结