linux 下的时间函数

 

1. linux文件的时间

linux文件的时间分为三种,访问时间(access time)修改时间(modify time)和创造时间(create time)。其中:
文件的 Access timeatime 是在读取文件或者执行文件时更改的。

文件的 Modified timemtime 是在写入文件时随文件内容的更改而更改的
文件的 Create timectime 是在写入文件、更改所有者、权限或链接设置时随Inode 的内容更改而更改的。

因此,更改文件的内容即会更改 mtime ctime,但是文件的 ctime 可能会在 mtime 未发生任何变化时更改 - 在权限更改,但是文件内容没有变化的情况下。

ls(1) 命令可用来列出文件的 atimectime mtime

ls -lc filename 列出文件的 ctime

ls -lu filename 列出文件的 atime

ls -l filename 列出文件的 mtime

2. linux 时间函数编程

通过学习许多C/C++库,你可以有很多操作、使用时间的方法。但在这之前你需要了解一些时间日期的概念,主要有以下几个:

Coordinated Universal TimeUTC):协调世界时,又称为世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean TimeGMT)。比如,中国内地的时间与UTC的时差为+8,也就是UTC+8。美国是UTC-5 

Calendar Time:日历时间,是用从一个标准时间点到此时的时间经过的秒数来表示的时间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是相对时间,但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。 

epoch:时间点。时间点在标准C/C++中是一个整数,它用此时的时间和标准时间点相差的秒数(即日历时间)来表示。 

clock tick:时钟计时单元(而不把它叫做时钟滴答次数),一个时钟计时单元的时间长短是由CPU控制的。一个clock tick不是CPU的一个时钟周期,而是C/C++的一个基本计时单位

2.1 相关函数和结构

·                                 其中time()函数来获得日历时间(Calendar Time)。
gmtime()
localtime(),用于获取日历时间,也就是我们平时所说的年、月、日、时、分、秒等信息,这些信息保存在一个名为tm的结构体中。其中gmtime()函数是将日历时间转化为世界标准时间(即格林尼治时间),并返回一个tm结构体来保存这个时间,而localtime()函数是将日历时间转化为本地时间。比如现在用gmtime()函数获得的世界标准时间是200573071820,那么我用localtime()函数在中国地区获得的本地时间会比世界标准时间晚8个小时,即2005730151820。下面是个例子:

·                                  asctime()函数和ctime()函数将时间以固定的格式显示出来,两者的返回值都是char*型的字符串。返回的时间格式为:

·                                 星期几月份日期时::秒年/n/0 

·                                 例如:Wed Jan 02 02:03:55 1980/n/0

·                                 其中/n是一个换行符,/0是一个空字符,表示字符串结束。其中asctime()函数是通过tm结构来生成具有固定格式的保存时间信息的字符串,而ctime()是通过日历时间来生成时间字符串。这样的话, asctime()函数只是把tm结构对象中的各个域填到时间字符串的相应位置就行了,而ctime()函数需要先参照本地的时间设置,把日历时间转化为本地时间,然后再生成格式化后的字符串。在下面,如果t是一个非空的time_t变量的话,那么:printf(ctime(&t));等价于:

·                                 struct tm *ptr; 

·                                 ptr=localtime(&t); 

·                                 printf(asctime(ptr));

·                                 那么,下面这个程序的两条printf语句输出的结果就是不同的了(除非你将本地时区设为世界标准时间所在的时区):

·                                 mktime()函数将用tm结构表示的时间转化为日历时间。其函数原型如下其返回值就是转化后的日历时间。这样我们就可以先制定一个分解时间,然后对这个时间进行操作了,下面的例子可以计算出199771是星期几:

·                                  现在注意了,有了mktime()函数,是不是我们可以操作现在之前的任何时间呢?你可以通过这种办法算出1945815号是星期几吗?答案是否定的。因为这个时间在197011之前,所以在大多数编译器中,这样的程序虽然可以编译通过,但运行时会异常终止。

·                                 2.2自定义时间格式

·                                 我们可以使用strftime()函数将时间格式化为我们想要的格式。它的原型如下: size_t strftime( 

·                                 char *strDest, 

·                                 size_t maxsize, 

·                                 const char *format, 

·                                 const struct tm *timeptr 

·                                 );

·                                 我们可以根据format指向字符串中格式命令把timeptr中保存的时间信息放在strDest指向的字符串中,最多向strDest中存放maxsize个字符。该函数返回向strDest指向的字符串中放置的字符数。函数strftime()的操作有些类似于sprintf():识别以百分号(%)开始的格式命令集合,格式化输出结果放在一个字符串中。格式化命令说明串 strDest中各种日期和时间信息的确切表示方法。格式串中的其他字符原样放进串中。格式命令列在下面,它们是区分大小写的。
%a
星期几的简写 

·                                 %A 星期几的全称 

·                                 %b 月分的简写 

·                                 %B 月份的全称 

·                                 %c 标准的日期的时间串 

·                                 %C 年份的后两位数字 

·                                 %d 十进制表示的每月的第几天 

·                                 %D // 

·                                 %e 在两字符域中,十进制表示的每月的第几天 

·                                 %F -- 

·                                 %g 年份的后两位数字,使用基于周的年 

·                                 %G 年分,使用基于周的年 

·                                 %h 简写的月份名 

·                                 %H 24小时制的小时 

·                                 %I 12小时制的小时 

·                                 %j 十进制表示的每年的第几天 

·                                 %m 十进制表示的月份 

·                                 %M 十时制表示的分钟数 

·                                 %n 新行符 

·                                 %p 本地的AMPM的等价显示 

·                                 %r 12小时的时间 

·                                 %R 显示小时和分钟:hh:mm 

·                                 %S 十进制的秒数 

·                                 %t 水平制表符 

·                                 %T 显示时分秒:hh:mm:ss 

·                                 %u 每周的第几天,星期一为第一天(值从06,星期一为0 

·                                 %U 第年的第几周,把星期日做为第一天(值从053 

·                                 %V 每年的第几周,使用基于周的年 

·                                 %w 十进制表示的星期几(值从06,星期天为0 

·                                 %W 每年的第几周,把星期一做为第一天(值从053 

·                                 %x 标准的日期串 

·                                 %X 标准的时间串 

·                                 %y 不带世纪的十进制年份(值从099 

·                                 %Y 带世纪部分的十进制年份 

·                                 %z%Z 时区名称,如果不能得到时区名称则返回空字符。 

·                                 %% 百分号 

·                                  

·                                 如果想显示现在是几点了,并以12小时制显示,就象下面这段程序: 

·                                  

·                                 2.3 计算持续时间的长度 

·                                 有时候在实际应用中要计算一个事件持续的时间长度,比如计算打字速度。在第1节计时部分中,我已经用clock函数举了一个例子。Clock()函数可以精确到毫秒级。同时,我们也可以使用difftime()函数,但它只能精确到秒。该函数的定义如下:

·                                 double difftime(time_t time1, time_t time0);

·                                 虽然该函数返回的以秒计算的时间间隔是double类型的,但这并不说明该时间具有同double一样的精确度,这是由它的参数觉得的(time_t是以秒为单位计算的)。比如下面一段程序:

·                                 3、延时函数

延时可以采用如下函数:

unsigned int sleep(unsigned int seconds); 

sleep()会使目前程式陷入「冬眠」seconds秒,除非收到「不可抵」的信号。 

如果sleep()没睡饱,它将会返回还需要补眠的时间,否则一般返回零。 

 

void usleep(unsigned long usec); 

usleepsleep()类同,不同之处在於秒的单位为10E-6秒。 

 

int select(0,NULL,NULL,NULL,struct timeval *tv); 

可以利用select的实作sleep()的功能,它将不会等待任何事件发生。 

 int nanosleep(struct timespec *req,struct timespec *rem); 

nanosleep会沉睡req所指定的时间,若remnon-null,而且没睡饱,将会把要补眠的时间放在rem上。 

 4、定时器

4.1alarm

如果不要求很精确的话,用 alarm() signal() 就够了

     unsigned int alarm(unsigned int seconds)

     专门为SIGALRM信号而设,在指定的时间seconds秒后,将向进程本身发送SIGALRM信号,又称为闹钟时间。进程调用alarm后,任何以前的alarm()调用都将无效。如果参数seconds为零,那么进程内将不再包含任何闹钟时间。如果调用alarm()前,进程中已经设置了闹钟时间,则返回上一个闹钟时间的剩余时间,否则返回0

 

         示例:

4.2setitimer

int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));

setitimer()alarm功能强大,支持3种类型的定时器:

 ITIMER_REAL :   以系统真实的时间来计算,它送出SIGALRM信号。 

ITIMER_VIRTUAL :   以该行程真正有执行的时间来计算,它送出SIGVTALRM信号。 

ITIMER_PROF :   以行程真正有执行及在核心中所费的时间来计算,它送出SIGPROF信号。 

Setitimer()第一个参数which指定定时器类型(上面三种之一);第二个参数是结构itimerval的一个实例;第三个参数可不做处理。

Setitimer()调用成功返回0,否则返回-1

下面是关于setitimer调用的一个简单示范,在该例子中,每隔一秒发出一个SIGALRM,每隔0.5秒发出一个SIGVTALRM信号::

         注意:Linux信号机制基本上是从Unix系统中继承过来的。早期Unix系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,因此,把那些建立在早期机制上的信号叫做"不可靠信号",信号值小于SIGRTMIN(Red hat 7.2中,SIGRTMIN=32SIGRTMAX=63)的信号都是不可靠信号。这就是"不可靠信号"的来源。它的主要问题是:进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值