今天发现之前写的程序里的定时器类很有问题,这两天进行修改,今天先来复习一下理论知识。
服务器程序要处理种种定时任务,比如定期执行某回调函数监控客户连接等等。在并发的服务器中,显然不能用sleep这样的阻塞定时函数来做,以下介绍4种定时的方法,其中又以最后一种timerfd目前最为常见,至少我目前读到的muduo、handy都是用这一种。
1、socket选项
通过设置socket选项SO_RCVTIMED SO_SNDTIMED可以实现定时器,他们分别设置socket接受数据和发送数据的超时时间,此时再调用send、recv、accept等函数时就会触发超时。
如果超时,那么上述系统调用返回-1,并且将errno设置为EAGAIN或EWOULDBLOCK等。
程序(仅展示关键部分):
先设置超时时间
struct timeval timeout;
timeout.tv_sec = time;
timeout.tv_usec = 0;