摘要:if(SELECT(sockfd+1,&rdfds,NULL,NULL,&tv)==0){超时处理}……三、设置定时器这种方法的原理是在从套接字接收数据之前先设置8秒钟的定时器。如果8秒钟内没有数据到来,内核产生的SIGALRM信号会中断当前的读操作。我们知道设置信号捕捉函数可以用signal函数或是sigaction函数。但这里只能使用sig
if (SELECT(sockfd+1, &rdfds, NULL, NULL, &tv) == 0)
{
超时处理
}
……
三、 设置定时器
这种方法的原理是在从套接字接收数据之前先设置8秒钟的定时器。如果8秒钟内没有数据到来,内核产生的SIGALRM信号会中断当前的读操作。我们知道设置信号捕捉函数可以用signal函数或是sigaction函数。但这里只能使用sigaction函数,因为signal设置的信号处理函数执行完后会重新执行被中断的操作。参考代码如下:
void handler(int signo) // 自定义SIGALRM信号处理函数
{
return;
}
struct sigaction act; // 描述信号行为的变量
……
sigaction(SIGALRM, NULL, &act); // 获取SIGALRM信号的属性
act.sa_handler = handler; // 设置SIGALRM信号的处理函数
act.sa_flags &= ~SA_RESTART; // 关闭重启被中断操作的选项
sigaction(SIGALRM, &act, NULL); // 设置SIGALRM信号的属性
alarm(8); // 设置8秒钟的定时器
……
虽然我们是以套接字的读操作为例,实际上在很多类似的情况中,大家都可以酌情采取上面介绍的方法。巧妙的运用所学知识会让你的程序更加灵活和人性化。
[1] [2]
通信工程师备考资料免费领取
去领取