在Linux网络开发中,我们常常会调用系统函数gethostbyname获取一域名的IP地址。
用过这个函数的人都知道,在网络不通的情况下,该函数调用会引起阻塞直至超时,有时这种情况是令人无法接受的。为此,我们通常会希望gethostbyname在超时一段时间如3秒后可以快速地返回,幸运地,我们还有jmp类函数。
1。setjmp and longjmp
对于setjmp和longjmp的使用还应该注意一些问题:
setjmp和longjmp函数,这两个函数在跳转时会带信号屏蔽字跳转,在信号处理程序(hanlder)中使用longjmp会导致后来产生的这种信号被屏蔽,无法调用此种信号的信号处理函数。
2。sigsetjmp and siglongjmp
POSIX.1
也没有具体说明setjmp和longjmp对信号屏蔽字的作用,而是定义了两个新函数:
sigsetjmp和siglongjmp。sigsetjmp在参数为非0的时候,会保存进程的当前信号屏蔽字;在调用siglongjmp的时候,再
恢复保存的信号屏蔽字。
对头,sigsetjmp/siglongjmp就是我们所需要的,我们要确保handle函数不会被忽略。
如法如下:
#include
#include
static sigjmp_buf jmpbuf;
static void alarm_func()
{
siglongjmp(jmpbuf, 1);
}
static struct hostent *gngethostbyname(char *HostName, int timeout)
{
struct hostent *lpHostEnt;
signal(SIGALRM, alarm_func);
if(sigsetjmp(jmpbuf, 1) != 0)
{
alarm(0);//timout
signal(SIGALRM, SIG_IGN);
return NULL;
}
alarm(timeout);//setting alarm
lpHostEnt = gethostbyname(HostName);
signal(SIGALRM, SIG_IGN);
return lpHostEnt;
}
这样通过接口gngethostbyname,可以进行DNS查询动作,同时可控最大超时时间。
阅读(3579) | 评论(0) | 转发(0) |