8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
最近学习了muduo网络库的源代码,学习了很多计时的方法,联想到Linux环境下无论是表示时刻还是表示时间段的,都有很多函数可以使用。写下这篇博客做一个总结
概念:时间与时刻
我们日常引用的“时间”一词,严格来说有两种意思,一是“时刻”,而是“时间间隔”
“时刻”是一种瞬时概念,“现在几点”就是一种时刻概念。在Linux系统中采用时间戳(TimeStamp)表示时刻。具体的时间戳有不同的数据结构表示方法,含义是自1970年开始所经历的时间,可以是秒数,也可以包含微秒等。
如果我们用一个64位的有符号数表示自1970年开始经过的时间,每年以365天计,则它最多可以表达的年限数大约是(2^63)/365/24/60/60 = 2.92e12(年)
即使存储微秒数,可以表示的年限范围也可以达到(2^63)/365/24/60/60/1000/1000 = 2.92e6(年)
表示的范围是十分可观的。
“时间间隔”是一种“间隔”,“持续”的概念,可以用简单的int,short表示间隔的秒数或毫秒数,也可以以结构体提高表示的精度,包含秒数和微秒数等。
相关数据结构1
2
3
4
5time_t
///表示自Epoch经过的秒数
///长度应该与操作系统有关, 源码经过了一系列的宏定义和封装
///在我的64位Ubuntu操作系统下是 long int型1
2
3
4
5
6struct {
time_t tv_sec;
susecons_t tv_usec;///long int
};
///表示自Epoch至今经过的秒数和毫秒数1
2
3
4
5
6struct timezone{
int tz_minuteswest;
int tz_dsttime;
};
///夏令时的相关数据结构
///作为一个中国人,我真的不是很熟悉夏令时T-T1
2
3
4
5
6
7
8
9
10
11
12
13struct tm {
int tm_sec; /* Seconds (0-60) */
int tm_min; /* Minutes (0-59) */
int tm_hour; /* Hours (0-23) */
int tm_mday; /* Day of the month (1-31) */
int tm_mon; /* Month (0-11) */
int tm_year; /* Year - 1900 */
int tm_wday; /* Day of the week (0-6, Sunday = 0) */
int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */
int tm_isdst; /* Daylight saving time */
};
///方便阅读和其他转换操作的一种数据结构1
2
3
4
5
6struct timespec {
time_t tv_sec; /* Seconds */
long tv_nsec; /* Nanoseconds */
};
///表示“时间间隔”
///精确到纳秒1
2
3
4
5
6
7struct itimerspec {
struct timespec it_interval; /* Timer interval */
struct timespec it_value; /* Initial expiration */
};
///用于定时的数据结构,每一个成员都表示时间间隔
///it_interval 表示第一次唤醒定时器后,周期性唤醒定时器的时间间隔
///it_value 表示第一次唤醒定时器,距今的时间间隔1
2
3
4
5
6
7
8struct timeb {
time_t time;
unsigned short millitm;
short timezone;
short dstflag;
};
///顾名思义的数据结构,只被 ftime 函数使用了1
2
3
4
5
6struct {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
///表示“时间间隔”
///精确到微秒1
2
3
4
5
6
7struct itimerval {
struct it_interval; /* Interval for periodic timer */
struct it_value; /* Time until next expiration */
};
///用于定时的数据结构,每一个成员都表示时间间隔
///it_interval 表示第一次唤醒定时器后,周期性唤醒定时器的时间间隔
///it_value 表示第一次唤醒定时器,距今的时间间隔
Linux函数与分类
Linux中时间相关的函数,大致可以分为4类获取当前时间戳。获得两个时间戳可以计算时间间隔
日期格式转换
定时操作。在指定的时刻进行特定任务,或在一定时间间隔之后进行特定任务
设置时间
具体的函数功能请参考linux手册,在这里只做总结,不进行具体讲解功能函数获取时间戳time, ftime, gettimeofday
日期格式转换sctime, ctime, gmtime, localtime,
mktime, asctime_r, ctime_r, gmtime_r, localtime_r
定时操作sleep, alarm, usleep, nanosleep,
clock_nanosleep, getitimer/setitimer,
timer_create/timer_settime/timer_gettime/timer_delete, timerfd_create/timerfd_gettime/timerfd_settime
设置时间settimeofday, clock_settime数据结构函数精确度struct timebftime毫秒
time_ttime, ctime, ctime_r, gmtime,
gmtime_r, localtime, localtime_r秒
struct timevalgettimeofday, settimeofday,微秒
struct timespec/struct itimerspecclock_gettime, clock_settime, timer_settime,
timer_gettime, timefd_gettime, timerfd_settime纳秒
struct timeval/struct itimervalgetitimer, setitimer,微秒
struct tmasctime, asctimer_r, localtime_r, mktime秒
参考资料
《Linux多线程服务端编程,使用muduo c++网络库》 第7,8章