《UNIX环境高级编程》札记-文件时间
对于每个文件都有3个时间字段,它们保存在stat结构中:
修改时间是对文件内容最后一次修改的时间,更改时间是对文件的i节点最后一次修改的时间。
下面使用linux命令来说明说明文件的三个时间字段。
生成文件,使用stat命令查看文件的三个时间,三个时间相同:
yan@yan-vm:~/apue$ touch timefile
yan@yan-vm:~/apue$ stat timefile
File: `timefile'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 802h/2050d Inode: 939363 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ yan) Gid: ( 1000/ yan)
Access: 2013-07-10 11:05:09.220457813 +0800
Modify: 2013-07-10 11:05:09.220457813 +0800
Change: 2013-07-10 11:05:09.220457813 +0800
Birth: -
写入字符到文件:
yan@yan-vm:~/apue$ echo "123" > timefile
yan@yan-vm:~/apue$ stat timefile
File: `timefile'
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: 802h/2050d Inode: 939363 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ yan) Gid: ( 1000/ yan)
Access: 2013-07-10 11:05:09.220457813 +0800
Modify: 2013-07-10 11:08:25.660465123 +0800
Change: 2013-07-10 11:08:25.660465123 +0800
Birth: -
文件的访问时间没有改变(没有访问文件),文件的修改时间变动(文件内容被修改),文件的更改时间变动(猜想,文件写入了
新的内容,文件的长度等信息发生变化,而这些信息是在i节点中的)
读取文件:
yan@yan-vm:~/apue$ cat timefile
123
yan@yan-vm:~/apue$ stat timefile
File: `timefile'
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: 802h/2050d Inode: 939363 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ yan) Gid: ( 1000/ yan)
Access: 2013-07-10 11:11:44.036460054 +0800
Modify: 2013-07-10 11:08:25.660465123 +0800
Change: 2013-07-10 11:08:25.660465123 +0800
Birth: -
文件的访问时间改变(读取了文件),文件的修改和更改时间没有变动(没有修改文件,也没有更改文件属性)
yan@yan-vm:~/apue$ chmod o+w timefile
yan@yan-vm:~/apue$ stat timefile
File: `timefile'
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: 802h/2050d Inode: 939363 Links: 1
Access: (0666/-rw-rw-rw-) Uid: ( 1000/ yan) Gid: ( 1000/ yan)
Access: 2013-07-10 11:11:44.036460054 +0800
Modify: 2013-07-10 11:08:25.660465123 +0800
Change: 2013-07-10 11:13:05.992583715 +0800
Birth: -
文件的访问和修改时间没有改变(没有访问和修改文件的内容),文件的更改时间改变(更改了文件的属性)
注意:系统并不保存对一个i节点的最后一次访问时间,所以access和stat函数并不更改这3个时间。
对文件的增加,删除,修改会影响文件所在的目录相关的时间,具体如下表所示:
一个文件的访问和修改时间可以用utime函数更改。
#include <unistd.h> int utime(const char* pathname, const struct utimbuf* times);utimbuf结构定义如下:
struct utimbuf{
time_t actime; //访问时间
time_t modtime; //修改时间
}
结构中的2个时间是自1970年1月1日00:00:00以来国际标准所进过的时间。
如果times是NULL,则访问时间和修改时间都设置为当前时间,如果times不是NULL,则访问时间和修改时间设置为times所指向
的结构的值。当然这些操作的条件是:进程的有效用户ID等于文件所有者的ID或者进程是超级用户(root)。
实践:
#include <stdio.h> #include <utime.h> #include <fcntl.h> int main(void){ if(utime("timefile", NULL)<0){ perror("utime"); return -1; } return 0; }
运行结果:
yan@yan-vm:~/apue$ stat timefile
File: `timefile'
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: 802h/2050d Inode: 939363 Links: 1
Access: (0666/-rw-rw-rw-) Uid: ( 1000/ yan) Gid: ( 1000/ yan)
Access: 2013-07-10 12:01:15.280643563 +0800
Modify: 2013-07-10 12:01:15.280643563 +0800
Change: 2013-07-10 12:01:15.280643563 +0800
Birth: -
yan@yan-vm:~/apue$ date
Wed Jul 10 12:01:48 CST 2013
yan@yan-vm:~/apue$ ./a.out
yan@yan-vm:~/apue$ stat timefile
File: `timefile'
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: 802h/2050d Inode: 939363 Links: 1
Access: (0666/-rw-rw-rw-) Uid: ( 1000/ yan) Gid: ( 1000/ yan)
Access: 2013-07-10 12:01:50.492641493 +0800
Modify: 2013-07-10 12:01:50.492641493 +0800
Change: 2013-07-10 12:01:50.492641493 +0800
Birth: -
访问和修改时间变成当前时间,最后的结果中更改时间也该成了当前时间,即程序执行时的时间,猜测在修改访问和修改
时间时,其实也是修改了i节点的信息。
#include <stdio.h> #include <utime.h> #include <fcntl.h> int main(void){ struct stat statbuf; struct utimbuf timebuf; if(stat("timefile", &statbuf)<0){ perror("stat"); return -1; } timebuf.actime = statbuf.st_atime+10; timebuf.modtime = statbuf.st_mtime+20; if(utime("timefile", &timebuf)<0){ perror("utime"); return -1; } return 0; }运行结果:
yan@yan-vm:~/apue$ stat timefile
File: `timefile'
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: 802h/2050d Inode: 939363 Links: 1
Access: (0666/-rw-rw-rw-) Uid: ( 1000/ yan) Gid: ( 1000/ yan)
Access: 2013-07-10 12:15:10.256707533 +0800
Modify: 2013-07-10 12:15:10.256707533 +0800
Change: 2013-07-10 12:15:10.256707533 +0800
Birth: -
yan@yan-vm:~/apue$ date
Wed Jul 10 12:15:17 CST 2013
yan@yan-vm:~/apue$ ./a.out
yan@yan-vm:~/apue$ stat timefile
File: `timefile'
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: 802h/2050d Inode: 939363 Links: 1
Access: (0666/-rw-rw-rw-) Uid: ( 1000/ yan) Gid: ( 1000/ yan)
Access: 2013-07-10 12:15:20.000000000 +0800
Modify: 2013-07-10 12:15:30.000000000 +0800
Change: 2013-07-10 12:15:18.556685755 +0800
访问时间增加了10秒,修改时间增加了20秒,更改时间修改为程序执行时的时间。