《unix环境高级编程》 读书笔记 (5)

近来读书,做些笔记,来年好翻翻。

本文所使用的操作系统为 CentOS7.0,如果不想装双系统的可以装虚拟机,可以参考这里:

http://blog.csdn.net/alex_my/article/details/38142229

date and time


涉及到的函数列出如下,然后再举例运行,输出结果,比较直观。

时间这块资料有限,如果有误,还望指正。

#include <time.h>

time_t time(time_t*tloc);

int clock_getres(clockid_t clk_id, struct timespec* res);

int clock_gettime(clockid_t clk_id, struct timespec* tp);

int clock_settime(clockid_t clk_id, const struct timespec* tp);

////////////////////////////

#include <sys/time.h>

int gettimeofday(struct timeval* restrict tp, void* restrict tzp);

////////////////////////////

#include <time.h>

char* asctime(const struct tm* tm);

char* asctime_r(const struct tm* tm, char* buf);

char* ctime(const time_t* timep);

char* ctime_r(const time_t* timep, char* buf);

struct tm* gmtime(const time_t* timep);

struct tm* gmtime_r(const time_t* timep, struct tm* result);

struct tm* localtime(const time_t* timep);

struct tm* localtime_r(const time_t* timep, struct tm* result);

time_t mktime(struct tm* tm);

////////////////////////////

#include <time.h>

size_t strftime(char* s, size_t max, const char* format, const struct tm* tm);

///////////////////////////

#define _XOPEN_SOURCE       /* See feature_test_macros(7) */

#include <time.h>

char* strptime(const char* s, const char* format, struct tm* tm);


#include <time.h>

time_t time(time_t* tloc);

Epoch: 指的是一个特定的时间, 1970年1月1日 00:00:00 UTC

return:

time函数返回从Epoch到当前的秒数,如果参数tloc不为null,还会赋值到tloc中。

如果出错,则会返回-1。

程序用例:

#include <stdio.h>

#include <time.h>

int main(int argc, char* argv[])

{

time_t t = time(NULL);

printf("time: %d\n", static_cast<int>(t));

return 0;

}

输出:

time: 1410606639


#include <time.h>

int clock_getres(clockid_t clk_id, struct timespec* res);

int clock_gettime(clockid_t clk_id, struct timespec* tp);

int clock_settime(clockid_t clk_id, const struct timespec* tp);

return:

如果正常则返回0,错误返回-1。结果均填充在res(tp)中。

timespec的定义:

struct timespec

{

time_t   tv_sec;        /* seconds */

long     tv_nsec;       /* nanoseconds */

};

clk_id用于指定计时时钟的类型,有以下选项:

CLOCK_REALTIME: 系统实时时间,从Epoch计时,可以被用户更改以及adjtime和NTP影响。

CLOCK_REALTIME_COARSE: 系统实时时间,比起CLOCK_REALTIME有更快的获取速度,更低一些的精确度。

CLOCK_MONOTONIC: 从系统启动这一刻开始计时,即使系统时间被用户改变,也不受影响。系统休眠时不会计时。受adjtime和NTP影响。

CLOCK_MONOTONIC_COARSE: 如同CLOCK_MONOTONIC,但有更快的获取速度和更低一些的精确度。受NTP影响。

CLOCK_MONOTONIC_RAW: 与CLOCK_MONOTONIC一样,系统开启时计时,但不受NTP影响,受adjtime影响。

CLOCK_BOOTTIME: 从系统启动这一刻开始计时,包括休眠时间,受到settimeofday的影响。

CLOCK_PROCESS_CPUTIME_ID: 本进程开始到此刻调用的时间。

CLOCK_THREAD_CPUTIME_ID: 本线程开始到刺客调用的时间。

clock_getres获取指定类型时钟的精确度。

clock_gettime和clock_settime取得和设置clk_id指定的时间。

看过用例就明白了。

程序用例:clock_getres和clock_gettime

#include <stdio.h>

#include <time.h>

static void ShowTime(const char* desc, const timespec* res)

{

printf("%s: \t %d\t %d\n", desc, res->tv_sec, res->tv_nsec);

}

static void TestTime(clockid_t clk_id)

{

struct timespec res;

clock_getres(clk_id, &res);

ShowTime("clock_getres", &res);

clock_gettime(clk_id, &res);

ShowTime("clock_gettime", &res);

}

int main(int argc, char* argv[])

{

// 为了方便阅读,假设函数调用成功

printf("CLOCK_REALTIME: \n");

TestTime(CLOCK_REALTIME);

printf("\n\nCLOCK_REALTIME_COARSE:\n");

TestTime(CLOCK_REALTIME_COARSE);

printf("\n\nCLOCK_MONOTONIC:\n");

TestTime(CLOCK_MONOTONIC);

return 0;

}

输出:

CLOCK_REALTIME:

clock_getres: 0 1

clock_gettime: 1410750427 192193358

CLOCK_REALTIME_COARSE:

clock_getres: 0 1000000

clock_gettime: 1410750427 191422911

CLOCK_MONOTONIC:

clock_getres: 0 1

clock_gettime: 4269 364748226



#include <sys/time.h>

int gettimeofday(struct timeval* restrict tp, void* restrict tzp);

return:

一直返回0

参数2 tzp必须为NULL

struct timeval

{

time_t tv_sec;       //秒 [long int]

suseconds_t tv_usec; //微秒 [long int]

}

程序用例:

#include <stdio.h>

#include <sys/time.h>

int main(int argc, char* argv[])

{

timeval tp;

int ret = gettimeofday(&tp, NULL);

printf("ret: %d\t sec: %d\t usec: %d\n", ret, tp.tv_sec, tp.tv_usec);

return 0;

}

输出:

ret: 0 sec: 1410752524 usec: 95274


char* asctime(const struct tm* tm);

char* asctime_r(const struct tm* tm, char* buf); // buf: 26 bytes at least

char* ctime(const time_t* timep);

char* ctime_r(const time_t* timep, char* buf);   // buf: 26 bytes at least

struct tm* gmtime(const time_t* timep);

struct tm* gmtime_r(const time_t* timep, struct tm* result);

struct tm* localtime(const time_t* timep);

struct tm* localtime_r(const time_t* timep, struct tm* result);

time_t mktime(struct tm* tm);

tm定义:

struct tm

{

int tm_sec;         /* seconds */

int tm_min;         /* minutes */

int tm_hour;        /* hours */

int tm_mday;        /* day of the month */

int tm_mon;         /* month */

int tm_year;        /* year */

int tm_wday;        /* day of the week */

int tm_yday;        /* day in the year */

int tm_isdst;       /* daylight saving time */ /* 是否是夏令制 */

/** the glibc version of struct tm has additional fields:

/** long tm_gmtoff;

/** const char* tm_zone;

*/

};

asctime/asctime_r      : 把tm所表示的日期和时间转为字符串, 且会自动转为本地时区

ctime/ctime_r          : 把日期和时间转为字符串

gmtime/gmtime_r        : 把time_t转换为tm,未经时区转换

localtime/localtime_r  : 把time_t转换为tm,转为本地时区

mktime                 : 将tm转换为time_t,UTC

以下示例展示了以上时间的用法:

#include <stdio.h>

#include <time.h>

#include <sys/time.h>

static void ShowTM(const char* desc, const tm* t)

{

printf("%s:\n", desc);

printf("%d-%02d-%02d %02d:%02d:%02d\n",

t->tm_year, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);

printf("yday: %d \t wday: %d \t isdst: %d\n\n",

t->tm_yday, t->tm_wday, t->tm_isdst);

}

int main(int argc, char* argv[])

{

// time

time_t t = time(NULL);

printf("time: %d\n\n", static_cast<int>(t));

// ctime and ctime_r

char* c1 = ctime(&t);

printf("ctime: c1: %s\n", c1);

char c20[64];

char* c2 = ctime_r(&t, c20);

printf("ctime_r: c2: %s \t c20: %s \n\n");

// gmtime and gmtime_r

tm* t1 = gmtime(&t);

ShowTM("gmtime-t1", t1);

tm t20;

tm* t2 = gmtime_r(&t, &t20);

ShowTM("gmtime_r-t2", t2);

ShowTM("gmtime_r-t20", &t20);

// localtime and localtime_r

tm* t3 = localtime(&t);

ShowTM("localtime-t3", t3);

tm t40;

tm* t4 = localtime_r(&t, &t40);

ShowTM("localtime_r-t4", t4);

ShowTM("localtime_r-t40", &t40);

// asctime and asctime_r

char* asc1 = asctime(t1);

printf("asctime-gmtime: %s\n", asc1);

char asc20[128];

char* asc2 = asctime_r(t1, asc20);

printf("asctime-gmtime: asc2: %s \t asc20: %s\n", asc2, asc20);

char* asc3 = asctime(t3);

printf("asctime-localtime: %s\n", asc3);

char asc40[128];

char* asc4 = asctime_r(t3, asc40);

printf("asctime-localtime: asc4: %s \t asc40: %s\n", asc4, asc40);

// mktime

time_t mkt1 = mktime(t1);

printf("mktime-gmtime: %d\n\n", static_cast<int>(mkt1));

time_t mkt2 = mktime(t3);

printf("mktime-localtime: %d\n", static_cast<int>(mkt2));

return 0;

}

输出:

time: 1410770573

ctime: c1: Mon Sep 15 16:42:53 2014

ctime_r: c2:

c20:

gmtime-t1:

114-08-15 08:42:53

yday: 257   wday: 1   isdst: 0

gmtime_r-t2:

114-08-15 08:42:53

yday: 257   wday: 1   isdst: 0

gmtime_r-t20:

114-08-15 08:42:53

yday: 257   wday: 1   isdst: 0

localtime-t3:

114-08-15 16:42:53

yday: 257   wday: 1   isdst: 0

localtime_r-t4:

114-08-15 16:42:53

yday: 257   wday: 1   isdst: 0

localtime_r-t40:

114-08-15 16:42:53

yday: 257   wday: 1   isdst: 0

asctime-gmtime: Mon Sep 15 16:42:53 2014

asctime-gmtime: asc2: Mon Sep 15 16:42:53 2014

asc20: Mon Sep 15 16:42:53 2014

asctime-localtime: Mon Sep 15 16:42:53 2014

asctime-localtime: asc4: Mon Sep 15 16:42:53 2014

asc40: Mon Sep 15 16:42:53 2014

mktime-gmtime: 1410770573

mktime-localtime: 1410770573


#include <time.h>

size_t strftime(char* s, size_t max, const char* format, const struct tm* tm);

strftime: 将tm按照format的格式,格式化输出到大小为max的字符串s中。

格式部分字符:

%a: 周几的英文缩写。

%A: 周几的英文全称。

%b: 月份的英文缩写。

%B: 月份的英文全称。

%c: 日期和时间, Tue Feb 10 19:45:20 2014。

%C: 年/100 [00, 99]。

%d: 每月的第几天 [01, 31] 。

%D: 日期 MM/DD/YY 09/15/14。

%e: 每月的第几天[1, 31], 个位数前添加空格。

%F: ISO 8601 日期格式 YYYY-MM-DD 2014-09-15。

%g: ISO 8601 年的最后2位,基于周的年 [00,99]。

%G: ISO 8601 基于周的年, 2014。

%h: 与%b相同。

%H: 小时(24小时制) [00, 23]。

%I: 小时(12小时制) [01, 12]。

%j: 一年的第几天, [000, 366]。

%m: 月份 [01, 12]。

%M: 分钟 [00, 59]。

%n: 换行符。

%p: AM/PM。

%r: 本地时间(12小时制) 09:15:21 PM。

%R: 与 %H:%M相同, 18:27。

%S: 秒 [00, 60]。

%t: 水平制表符。

%T: 与 %H:%M:%S相同。

%u: ISO 8601 [Monday = 1, 7]。

%U: 以周日作为标准,一年的第几周。在第一月第一周,如果该周一半(4天)以上属于该年,则作为本年第一周,否则做为上一年最后一周。

%V: ISO 8601 周数 [01, 53]。

%w: 一周的第几天 [Sunday = 0, 6]。

%W: 以星期一做为标准,一年的第几周。判断方法如同%U。

%x: 日期 09/15/14

%X: 时间 19:45:20

%y: 年的最后两位 [00, 99] 14

%Y: 年 2014

%z: ISO 8601格式的UTC偏移量

%Z: 时区名

%%: %

程序用例:

#include <stdio.h>

#include <time.h>

int main(int argc, char* argv[])

{

char desc[128] = {0};

time_t curr = time(NULL);

tm* t = localtime(&curr);

int n = strftime(desc, 128, "It is: %D\n", t);

printf("n: %d\t %s\n", n, desc);

return 0;

}

输出:

n: 16  It is: 09/15/14


#include <time.h>

char* strptime(const char* s, const char* format, struct tm* tm);

strptime: 按照特定时间格式将字符串转换为时间类型。

return:

成功返回s的最后位置。失败返回空指针。

程序用例:

#include <stdio.h>

#include <time.h>

int main(int argc, char* argv[])

{

tm t;

char buffer[256] = {0};

strptime("2014-09-15 21:44:45", "%Y-%m-%d %H:%M:%S", &t);

strftime(buffer, 256, "%d %b %Y %H:%M", &t);

puts(buffer);

return 0;

}

输出:

15 Sep 2014 21:44

时间: 2024-10-10 04:51:06

《unix环境高级编程》 读书笔记 (5)的相关文章

构建之法——读书笔记(8)

<构建之法>第十&十一章 主要讲述了在软件设计前期的需求分析问题上的方法和实践经验,分为"典型用户和场景"以及"软件设计与实现". 其中第十章大部分内容包含: 用户的分类(典型用户可以包括以下内容: 1. 名字(越自然越好) 2. 年龄(不同年龄和收入的用户有不同的需求) 3. 收入 4. 代表的用户在市场上的比例和重要性(比例大不等同于重要性高,如付费的用户比例较少,但是影响大,所以更重要 5. 使用这个软件的典型场景 6. 使用本软件/服务的

构建之法读书笔记之五

今天我学习了构建之法的第五章——典型用户与典型场景.我们都知道,软件开发最终都是服务于用户,所以用户主导着我们的开发方向.软件开发离不开用户,所以能够搞清楚用户隐藏的要求也是软件开发过程中的的一个重要的课题,这就涉及到了典型用户. 典型用户,顾名思义,能够代表大部分用户的用户.很多时候,不考虑典型用户的话,软件的开发不可能把所有的方面都做的尽善尽美,开发人员不可能把所有的方面都能考虑到.这时候,典型用户就站了出来.但同时,典型用户也有两面性——受欢迎的与不受欢迎的.那些能够按照开发者期望进行操作

软件 = 程序 + 软件工程(构建之法读书笔记一)

在我正式开始阅读这本书之前,我对于软件工程这个词汇的概念还是模糊的,认为它只是停留在是一门学科,一个专业,或者是一大堆硬生生的理论知识,然而当我读完构建之法这本书的推荐序和第一,第二版前言开始,我就深刻意识到我之前对于软件工程的肤浅认识是多么错误. 我看书一般喜欢从从书的封面开始看起,或许这也是大多数人看书的习惯,·在本书的封面素描着一副鲁班锁,刚开始让人感觉有点奇怪,明明是一本讲软件工程的书,为什么要用鲁班锁做为封面图案呢?原来玄机深藏于鲁班锁的内部,这鲁班锁从外部看,是严丝合缝的十字立方体,

构建之法读书笔记

周末我抽空将<构建之法>第一章读完,感觉对软件工程又有了新的认识. <构建之法>开篇便写到:软件=程序+软件工程.我认为这是对软件的一种及其精炼的解释.程序即是指一行行代码,软件工程则包含了各种软件开发活动,包括构建管理.源代码管理.软件设计.软件测试.项目管理等等,是把系统的.有序的.可量化的方法应用到软件的开发.运营和维护上的过程. 作为一名机械专业的学生,我认为软件设计是我们必须掌握的一门技能.机械行业,除了大家普遍所能看到的机械结构,每一个设备还包含有控制.软件等部分,一个

构建之法读书笔记_1

本周我快速地阅读了一遍<构建之法>,提出以下几个问题: 1在满足客户需要的同时,我们有些什么原则需要坚持. 2软件测试方法有什么?做软件测试只是找BUG吗? 3什么是敏捷流程?怎样去根据自己的项目选择开发方法? 4第三章中有提及考级的相关内容,但是在社会工作中,实践经验比证书更重要,我们应该如何平衡理论知识与实践之间的关系? 5当今市场对软件有哪些主要需求,安全软件并不能填满所有的漏洞,它的发展前景真的有那么好吗?

构建之法读书笔记之三

在学习了构建之法第四章,第五章之后,写一下我的感想. 代码规范一直是我们在学习过程中一个老生常谈的话题.专业技能过硬与否只是一方面,代码规范同样也是一个举足轻重的方面.比如最开始的注释,在我们写一些很短的代码十几行,几十行代码的时候,如果不写注释,说白了,那么短的代码,谁都能找得到.但是,万一代码量上了三位数呢.几百行的代码,找那么一个错误,难度可是不小.再加点难度,四位数,五位数,甚至做项目的时候呢.没有注释,八成项目经理都不要你了. 代码规范有很多方面,处了注释,还有缩进,行宽,括号,分行,

构建之法读书笔记之二

由于近几周进行构建之法的学习很少,所以这周一下子看了三个周期的内容. 既然选择了软件工程专业,就决定了我们将来要朝着软件工程师的方向发展.那么,问题来了,如何成为一名合格的软件工程师,在成为一名软件工程师的过程中,我们又有那些需要注意和学习的地方呢. 软件工程师的成长道路上,首先对我们自己的专业技能有很高的要求.所以第一步,我们要丰富自己的专业技能,并奇瑞要很好的衡量自己的能力.这样一来,就有涉及到了衡量我们能力的标准.这里又有一个问题,对于这些衡量标准,我们不能抱着仅仅不被OUT的态度,不能只

构建之法读书笔记3

软件开发流程: 写了再改模式:适合只用一次的小程序 RUP统一流程:将不同类型的工作划分为规程和工作流. 老板驱动的流程:老板在整个流程中占据领导地位. 渐进交付的流程:现发布一个版本,然后根据反馈进行修改然后再发布,不断反复直到用户满意或无法进行下去时停止.MVP:最小可行产品,即先做出一个实现了关键功能的很小的软件供用户使用体验,然后根据用户反馈继续开发.MBP:最强最美产品,即等到产品做得完美了后再进行发布. TSP原则:优秀的模式和流程的共同点的总结. 瀑布模型以及瀑布模型的各种变形:适

构建之法——读书笔记(6)

第8章 需求分析 8.1 软件需求 寻找需求: 1. 获取和引导需求(Elicitation) 软件团队需要找到软件的利益相关者,了解和挖掘他们对软件的需求,引导他们表达出对软件的需求. 2. 分析和定义需求(Analysis&Specification) 这是指对从各个方面获取的需求进行规整,定义需求的内涵,从各个角度将需求量化(需求实现的最后期限,实现需求大致所需的时间和资源成本,各个不同需求的优先级,需求带来的收益,等等). 3. 验证需求(Validation) 软件团队要跟利益相关者沟

构建之法读书笔记01

第一章讲述了学生与老师的关系,很多内容都是老师上课所涉及到的,那就是如何让我们学好软件工程,在很多时候我们都是有惰性的,需要老师给与压力,也就是老师说的要想让我们真的学会游泳,就要下水,同时老师还需要踹我们一脚,不仅是在学士或者在游泳的过程中,都要让我们感到压力,那样才能激发我们求生的本能,同时能够让我们创造奇迹. 软件工程融汇了很多技术,书中更是列出了十多种相关科目,在感觉到博大精深的同时,有深深的感觉学习这门的压力,看到了软件工程的目标,就是创造“足够好”的软件,而足够好也是给我们纠正了,不