为什么要空闲断开?
对于服务端而言,由于连接数和内存的限制,我们不可能对一个长时间处于不活跃的客户端,单独维护一个fd,一个进程/线程始终为其服务,fd单个进程上限默认值为1024,由于内存的限制,也不能无限制的分配出进程或者线程为其服务,这个时候我们就需要断开在规定时间内没有任何动作的客户端,腾出内存为其他客户端服务。
控制连接空闲断开实现
1.首先是安装信号SIGALRM并启动定时闹钟
unsigned int alarm(unsigned int seconds);
alarm()函数的主要功能是设置信号传送闹钟,即用来设置信号SIGALRM在经过参数seconds秒数后发送给目前的进程。如果未设置信号SIGALARM的处理函数,那么alarm()默认处理终止进程。
如果在seconds秒内再次调用了alarm函数设置了新的闹钟,则后面定时器的设置将覆盖前面的设置,即之前设置的秒数被新的闹钟时间取代。
由于闹钟是安装在while循环中,如果在未超时的时间内,又收到命令,那么就会重新设置闹钟,之前那个闹钟就会销毁。
//启动一个闹钟
void start_cmdio_alarm(void)
{
if (tunable_idle_session_timeout > 0) {
// 安装信号
signal(SIGALRM, handle_alarm_timeout);
// 启动闹钟
alarm(tunable_idle_session_timeout);
}
}
2.信号处理函数