Muduo 网络编程示例(三)定时器

程序中的时间

程序中对时间的处理是个大问题,我打算单独写一篇文章来全面地讨论这个问 题。文章暂定名《〈程序中的日期与时间〉第二章 计时与定时》,跟《〈程序中的日期与时间〉第一 章 日期计算》放到一个系列,这个系列预计会有四篇文章。

在这篇博客里里我先简要谈谈与编 程直接相关的内容,把更深入的内容留给上面提到的日期与时间专题文章。

在一般的服务端程序设计中,与时间有关的常见任务有:

1. 获取当前时间,计算时间间隔 ;

2. 时区转换与日期计算;把纽约当地时间转换为上海当地时间;2011-02-05 之后第 100 天 是几月几号星期几?等等

3. 定时操作,比如在预定的时间执行一项任务,或者在一段延时之后 执行一项任务。

其中第 2 项看起来复杂,其实最简单。日期计算用 Julian Day Number,时区 转换用 tz database;惟一麻烦一点的是夏令时,但也可以用 tz database 解决。这些操作都是纯函 数,很容易用一套单元测试来验证代码的正确性。需要特别注意的是,用 tzset/localtime_r 来做时 区转换在多线程环境下可能会有问题;对此我的解决办法是写一个 TimeZone class,以避免影响全局 ,将来在日期与时间专题中会讲到。以下本文不考虑时区,均为 UTC 时间。

真正麻烦的是第 1 项和第 3 项。一方面,Linux 有一大把令人眼花缭乱的与时间相关的函数和结构体,在程序中该如何 选用?另一方面,计算机中的时钟不是理想的计时器,它可能会漂移或跳变;最后,民用的 UTC 时间 与闰秒的关系也让定时任务变得复杂和微妙。当然,与系统当前时间有关的操作也让单元测试变得困难 。

Linux 时间函数

Linux 的计时函数,用于获得当前时间:

* time(2) / time_t (秒 )

* ftime(3) / struct timeb (毫秒)

* gettimeofday(2) / struct timeval (微 秒)

* clock_gettime(2) / struct timespec (纳秒)

* gmtime / localtime / timegm / mktime / strftime / struct tm (这些与当前时间无关)

定时函数,用于让程序等 待一段时间或安排计划任务:

* sleep

* alarm

* usleep

* nanosleep

* clock_nanosleep

* getitimer / setitimer

* timer_create / timer_settime / timer_gettime / timer_delete

* timerfd_create / timerfd_gettime / timerfd_settime

时间: 2024-08-02 09:11:32

Muduo 网络编程示例(三)定时器的相关文章

Muduo 网络编程示例之零:前言

陈硕 (giantchen_AT_gmail)Blog.csdn.net/Solstice Muduo 全系列文章列表: http://blog.csdn.net/Solstice/category/779646.aspx我将会写一系列文章,介绍用 muduo 网络库完成常见的 TCP 网络编程任务.目前计划如下: UNP 中的简单协议,包括 echo.daytime.time.discard 等.  Boost.Asio 中的示例,包括 timer2~6.chat 等. Java Netty 

Muduo 网络编程示例(六)限制服务器的最大并发连接数

本文已以大家都熟悉的 EchoServer 介绍如何限制服务器的并发连接数. 本文的代码见 http://code.google.com/p/muduo/source/browse/trunk/examples/maxconnection/ <Muduo 网络 编程示例 系列>计划中的第六篇文章原本是"用于测试两台机器的带宽的 pingpong 程序", pingpong 协议的程序已经在<muduo 与 boost asio 吞吐量对比>和<muduo

Muduo 网络编程示例

我将会写一系列文章,介绍用 muduo 网络库完成常见的 TCP 网络编程任务.目前计划如下: UNP 中的简单协议,包括 echo.daytime.time.discard 等. Boost.Asio 中的示例, 包括 timer2~6.chat 等. Java Netty 中的示例,包括 discard.echo.uptime 等,其中的 discard 和 echo 带流量统计功能. Python twisted 中的示例,包括 finger01~07 用于测试两台机器的往返延迟的 rou

Muduo 网络编程示例(九)简单的消息广播服务

本文介绍用 muduo 实现一个简单的 topic-based 消息广播服务,这其实是"聊天室"的一个简单 扩展,不过聊天的不是人,而是分布式系统中的程序. 本文的代码见 http://code.google.com/p/muduo/source/browse/trunk/examples/hub 在分布式系统中,除了常用的 end-to-end 通信,还有一对多的广播通信.一提到"广播",或许 会让人联想到 IP 多播或 IP 组播,这不是本文的主题.本文将要谈的

Muduo 网络编程示例(二) Boost.Asio 的聊天服务器

本文讲介绍一个与 Boost.Asio 的示例代码中的聊天服务器功能类似的网络服务程序,包括客户端 与服务端的 muduo 实现.这个例子的主要目的是介绍如何处理分包,并初步涉及 Muduo 的多线程功能 .Muduo 的下载地址: http://muduo.googlecode.com/files/muduo-0.1.7-alpha.tar.gz ,SHA1 873567e43b3c2cae592101ea809b30ba730f2ee6,本文的完整代码可在线阅读 http://code.go

Muduo 网络编程示例(七)“串并转换”连接服务器及其自动化测试

本文介绍如何使用 test harness 来测试一个具有内部逻辑的网络服务程序. 本文的代码见 http://code.google.com/p/muduo/source/browse/trunk/examples/multiplexer 下载地址: http://muduo.googlecode.com/files/muduo-0.2.0-alpha.tar.gz SHA1 checksum: 75a09a82f96b583004876e95105c679e64c95715 云风在他的博客中

Muduo 网络编程示例(四)Twisted Finger

Python Twisted 是一款非常好的网络库,它也采用 Reactor 作为网络编程的基本模型,所以从使 用上与 muduo 颇有相似之处.(当然,muduo 没有 deferreds)Finger 是 twisted 文档的一个经典 例子,本文展示如何用 muduo 来实现最简单的 finger 服务端.限于篇幅,只实现 finger01~07.代 码位于 examples/twisted/finger . 1 拒绝连接 什么都不做,程序空等. finger01.cc 1: #inclu

Muduo 网络编程示例(一) 五个简单TCP协议

本文将介绍第一个示例:五个简单 TCP 网络服务协议,包括 echo (RFC 862).discard (RFC 863) .chargen (RFC 864).daytime (RFC 867).time (RFC 868),以及 time 协议的客户端.各协议的功 能简介如下: * discard - 丢弃所有收到的数据: * daytime - 服务端 accept 连接之 后,以字符串形式发送当前时间,然后主动断开连接: * time - 服务端 accept 连接之后,以 二进制形式

Muduo 网络编程示例(十)socks4a 代理服务器

本文介绍用 muduo 实现一个简单的 socks4a 代理服务器,代码见 http://code.google.com/p/muduo/source/browse/trunk/examples/socks4a/ . TCP 中继器 在实现 socks4a proxy 之前,我们先写一个功能更简单的网络程序-- TCP 中继器 (TCP relay),或者叫做穷人的 tcpdump (poor man's tcpdump). 一般情况下,客户端程序直接 连接服务端,如下图.有时候,我们想在 cl