全局跳转 setjmp longjmp

本文介绍了如何利用C语言中的setjmp和alarm函数处理IO超时问题,通过设置定时器来检测操作是否在规定时间内完成,从而避免程序因长时间等待而阻塞。

#include <setjmp.h> 
int setjmp(jmp_buf env) 
void longjmp(jmp_buf env, int val); 

setjmp 函数首次调用成功返回0(失败返回-1),以后得调用会返回longjmp第二个参数得值

/*
 * jump.c
 *
 *  Created on: 2011-11-18
 *      Author: snape
 */

#include <setjmp.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int j;
jmp_buf env;
int main(int argc, char **argv) {

	int i ;
	int k = 0;
	i = setjmp(env);

	fprintf(stderr, "i=%d,k=%d,j=%d\n", i, k++, j++);

//	if (3 == i) {
//		exit(0);
//	}

	sleep(1);
	longjmp(env, 100);

	return 0;
}



使用 alarm 和 setjmp 处理io超时

/*
 * alarm_jump_block.c
 *
 *  Created on: 2011-11-19
 *      Author: snape
 */

#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
#include <unistd.h>

//声明全局变量
int timeout = 0;
jmp_buf buf;

int main(int argc, char **argv) {
	void func(int);
	char c;
	//注册ALRM信号处理函数
	signal(SIGALRM, func);
	//设置跳转
	setjmp(buf);

	if (timeout == 0) {
		//开始定时
		alarm(3);
		//阻塞读取标准输入,如果3秒内 没有读到信息,ALRM信号到达,转到func函数
		read(0, &c, 1);
		//读取到信息,取消定时
		alarm(0);

		fprintf(stderr, "what you have input is [%c]\n", c);
	} else {
		fprintf(stderr, "timeout ! 3 seconds passed\n");
	}

	return 0;
}

void func(int sig) {
	timeout = 1;
	longjmp(buf, 1);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值