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

被折叠的 条评论
为什么被折叠?



