当前位置: 技术问答>linux和unix
关于SIGALRM中断函数调用问题。
来源: 互联网 发布时间:2016-11-13
本文导语: 本帖最后由 yanjinbin0 于 2011-03-08 20:34:44 编辑 关键代码如下: 1. 一个定时器信号处理函数 void init_sigaction(void) { struct sigaction act; act.sa_handler = HandleTimer; /*该函数如void HandleTimer(int signo){int i = 0;i = 1;}*/ ...
1.
一个定时器信号处理函数
void init_sigaction(void)2.
{
struct sigaction act;
act.sa_handler = HandleTimer; /*该函数如void HandleTimer(int signo){int i = 0;i = 1;}*/
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
sigaction(SIGALRM,&act,NULL);
}
启动定时器函数
void init_time(void)3.main()主进程函数
{
struct itimerval value;
value.it_value.tv_sec = 0;
value.it_value.tv_usec = 50*1000; //50*1000,数值1000*1000,500*1000都可以正常,但换成50就不行。
value.it_interval = value.it_value;
setitimer(ITIMER_REAL, &value, NULL);
}
main()
{
init_sigaction();/*该定时器是一定要的*/
init_time();
/*省略N行代码*/
rtv = connect(sock, (struct sockaddr *)s_addr, sizeof(struct sockaddr_in));
if(rtv == 0){
return sock;
}
if(errno != EINTR){ //如果被信号中断则需要等待,如不是则出错返回
close(sock);
return(-1);
}else{
do{
FD_ZERO (&wfd);
FD_ZERO(&rset);
FD_SET(sock,&rset);
FD_SET (sock, &wfd);
stv = select(sock + 1,&wfd, NULL, NULL,NULL); //永久等待
if( stv > 0){ //连接成功
printf("connect sourcessn");
return sock;
}else if(stv == 0){ //超时
printf("connect errno time out n");
close(sock);
return -1;
}
FD_CLR(sock, &wfd);
printf("connect errno == EINTRn");
}while(stv
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。