Chinaunix首页 | 论坛 | 博客
  • 博客访问: 177238
  • 博文数量: 44
  • 博客积分: 2541
  • 博客等级: 大尉
  • 技术积分: 361
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-20 10:46
文章分类
文章存档

2011年(1)

2010年(19)

2009年(24)

分类: LINUX

2009-12-24 16:42:32

在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查询动作,同时可控最大超时时间。

阅读(3518) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~