文件属性包括数据属性和管理属性。
所谓数据属性就是文件所记录的数据,是创建一个文件的真正目的,文件管理系统一般不会对文件的数据做解释,只做记录。对数据的具体解释和采用是由对应具体应用程序来处理。
管理属性则是出于管理目的而产生的信息,例如文件名、文件创建时间、文件修改时间、文件权限、文件用户ID和文件组ID,这些都是出自于管理目的而产生的,并随着管理的变动而变动。stat结构(参考《4.2 stat函数》)反映的信息全部为文件的管理属性。
stat.st_atime(数据的最后访问时间)、stat.st_mtime(数据的最后修改时间)、stat.st_ctime(i节点最后更改时间)是跟文件时间有关的三个方面的管理属性。
文件操作函数无非就是对文件的数据属性和管理属性进行操作。不同的文件操作函数,对文件的时间属性的影响是不同的。有的函数的操作只影响文件某个时间属性,有些影响其中两个,有些全部影响,甚至有些函数不仅影响所操作的文件自身的时间,还会影响文件所在的目录的时间属性。
1、一般来说,纯粹只对管理属性进行操作的函数(例如chmod、fchmod、chown、fchown和lchown函数)只对stat.ctime(i节点最后更改时间)有影响,不影响其他时间。
2、read函数纯粹是对一个已经打开的文件进行读操作,所以只影响stat.st_atime(数据的最后访问时间)。
3、创建新文件和新目录的函数,不仅影响新文件和新目录自身的相关所有时间还会影响其所在目录的stat.st_mtime(数据的最后修改时间)和stat.st_ctime(i节点最后更改时间)。
4、删除文件和目录的函数,不仅影响被删除文件和目录自身的相关stat.st_ctime(i节点最后更改时间)还会影响其所在目录的stat.st_mtime(数据的最后修改时间)和stat.st_ctime(i节点最后更改时间)。
详细的每个函数对时间属性的影响在P95页有个表格,列的非常详细清楚。
实例 x.4.18.1.c
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#define yearsecs (60 * 60 * 24 * 365)
int main(int argc, char *argv[])
{
char pathname[] = "/tmp/myfile";
struct stat buf;
if (stat(pathname, &buf) == -1)
printf("stat error for %s\n", pathname);
else
printf("atime:%d\nmtime:%d\nctime:%d\ncyear:%d\n",
buf.st_atime, buf.st_mtime, buf.st_ctime, (int)(buf.st_ctime/yearsecs)+1970);
exit(0);
}
[root@localhost unixc]# echo "123456789" > /tmp/myfile
[root@localhost unixc]# ls -l /tmp/myfile
----r-S--T. 2 root root 10 Nov 4 13:20 /tmp/myfile
[root@localhost unixc]# cc x.4.18.1.c
[root@localhost unixc]# ./a.out
atime:1383584112
mtime:1383589221
ctime:1383589221
cyear:2013
[root@localhost unixc]#
分析:实例所显示的时间信息显然不是我们所想象的那种年-月-日 时:分:秒。这是因为系统记录的时间是一个整数,这个整数表示自1970年1月1日00:00:00(国际标准时间)以来到时间记录所要表达的时间所经过的秒数。如果要让时间能看人肉眼看懂,还需要一些时间处理函数,例如时区转换、时间的格式化输出函数等。最后用“(int)(buf.st_ctime / yearsecs) + 1970”大致算了一下年份,确实是2013年。
这种表示自1970年1月1日00:00:00(国际标准时间)以来到时间记录所要表达的时间所经过的秒数的时间值称为日历时间。