setjmp和longjmp函数

来源:互联网 发布:java入门教程免费下载 编辑:程序博客网 时间:2024/05/18 13:43

#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学习总结

0 0
原创粉丝点击