前言
Linux终端中使用man 2 time
和man 3 ctime
查询后,可以得到很多相关函数说明,以下只取了三个函数。在调用Linux系统中的时间API接口时,仔细想了想如何给函数传参以及如何从函数接收返回值。想出了几种方法,然后写代码去运行,这个过程之中还是遇到了点问题,现在想通了于是好好梳理一番。
time_t time(time_t *tloc);
char *ctime(const time_t *timep);
char *ctime_r(const time_t *timep, char *buf);
time函数
time_t *tloc
类型是time_t 、输出型参数,函数提供返回值,类型也是time_t 。以下三种方式获取时间值都是可以的:
time_t t;
time(&t);
time_t t;
t = time(NULL);
time_t t;
t = time(&t);
机智的我还尝试了这种方式:
time_t *pt;
time(pt);
结果:段错误 (核心已转储)
原因:指针没有初始化就使用了!未初始化就使用很可能引起段错误,导致程序崩溃。指针未初始化它的值是不确定的,作为实参传入函数的时候,函数内部并不会再给它分配空间去初始化!
ctime函数
const time_t *timep
参数为输入型参数,因为它加了const
关键字。该函数内部动态申请内存用来存储字符串的值,并返回一个字符指针。ctime函数为不可重入函数,不可重入含义是:不可重复进入,不可被并行调用,不可被中断,依赖于任务环境,多任务调度过程中数据可能会出错。满足了以下几个特点多是不可重入函数:
- 函数体内使用了静态的数据结构;
- 函数体内调用了malloc()或者free()函数;
- 函数体内调用了标准I/O函数。
函数调用方法:
time_t t;
char *p;
t = time(&t);
p = ctime(&t); // here
printf("time: %s\n", p);
函数返回值直接定义指针就行了,p = ctime(&t);
的作用是给指针初始化。
ctime_r函数
The four functions asctime()
, ctime()
, gmtime()
and localtime()
return a pointer to static data and hence are not thread-safe. The thread-safe versions, asctime_r()
, ctime_r()
, gmtime_r()
and localtime_r()
, are specified by SUSv2.
根据man手册可以看出,ctime_r是ctime的线程安全版本,同时也是可重入函数,关键修改在于函数形参,可以传入数组而不在函数内部申请。