[原创]类Unix文件的时间属性_VMware, Unix及操作系统讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  VMware, Unix及操作系统讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3330 | 回复: 0   主题: [原创]类Unix文件的时间属性        下一篇 
wulcan
版主
等级:中校
经验:1795
发帖:124
精华:0
注册:2014-3-19
状态:离线
发送短消息息给wulcan 加好友    发送短消息息给wulcan 发消息
发表于: IP:您无权察看 2014-5-30 9:08:19 | [全部帖] [楼主帖] 楼主

以下以FreeBSD为例,其他类Unix系统都差不多,特殊的地方我会提示一下。

先上示例:

hu@mm:~ % echo "eeee" > tmp.txt
hu@mm:~ % stat tmp.txt
95 2327483 -rw-r--r-- 1 hu wheel 4657102 5 "May 29 08:11:02 2014" "May 29 08:11:12 2014" "May 29 08:11:12 2014" "May 29 08:11:02 2014" 32768 8 0 tmp.txt


请注意上面的结果,有四个时间,比windows多了一个。

第一个是:atime,也就是访问时间(Access Time);

第二个是:mtime,也就是修改时间(Modify Time);

第三个是:ctime,注意这不是Create Time,而是Change Time,等下再详细说。

上面这三个是Linux/Unix的标准,类Unix系统都有这三个时间。

最后一个目前大多数系统没有这个属性,我用过的系统中,仅FreeBSD的UFS和ZFS支持,叫做birthtime,顾名思义,就是Birth(产生)的时间,这才是“创建时间”。

atime和birthtime好理解,ctime和mtime会混淆:一句话:文件内容的改变,是mtime负责;文件整体属性的变,是ctime负责。再举一个例子:一个杯子,装水还是装酒,装100毫升还是200毫升,这是mtime负责;这个杯子放桌子上还是凳子上,归张三所有还是归李四所有,那是ctime负责。

我们接着上面继续来做几个练习:

1、只改变访问时间(atime)

hu@mm:~ % cat tmp.txt > /dev/null
hu@mm:~ % stat tmp.txt
95 2327483 -rw-r--r-- 1 hu wheel 4657102 5 "May 29 08:23:05 2014" "May 29 08:11:12 2014" "May 29 08:11:12 2014" "May 29 08:11:02 2014" 32768 8 0 tmp.txt


对照上面的示例,会发现仅atime改变了,其他三个都没变。

atime用的是最多的,无论是手动打开,或者是用脚本打开,甚至是自己写程序打开,都会触发atime改变。实际上,atime是跟系统调用有关的,除非你自己跟磁��打交道,否则就会触发atime。

2、只改变修改时间(mtime):

这个……咳!咳!……好吧,我承认,我没有办法只改变mtime而不改变ctime!

原因嘛!导致mtime改变的几个系统调用,都在改变ctime的系统周用列表中。可以用man 2 stat来查看这部分内容:

st_mtim Time when file data last modified. Changed by the mkdir(2),
mkfifo(2), mknod(2), utimes(2), write(2) and writev(2) sys-
tem calls.
st_ctim Time when file status was last changed (inode data modifica-
tion). Changed by the chflags(2), chmod(2), chown(2),
creat(2), link(2), mkdir(2), mkfifo(2), mknod(2), rename(2),
rmdir(2), symlink(2), truncate(2), unlink(2), utimes(2),
write(2) and writev(2) system calls.


3、同时改变ctime和mtime:

这个好像比较简单,再对tmp.txt添加一些字符就行了,注意这没有打开文件:

hu@mm:~ % echo "eeee" > tmp.txt
hu@mm:~ % stat tmp.txt
95 2327483 -rw-r--r-- 1 hu wheel 4686015 5 "May 29 08:23:05 2014" "May 29 08:37:48 2014" "May 29 08:37:48 2014" "May 29 08:11:02 2014" 32768 8 0 tmp.txt


4、单独改变ctime:

这个方法就比较多了,实际上,你仔细对照一个上面的man stat,就可以发现点什么。

好吧,我们就用最简单的chmod来看一下:

hu@mm:~ % chmod 777 tmp.txt
hu@mm:~ % stat tmp.txt
95 2327483 -rwxrwxrwx 1 hu wheel 4686015 5 "May 29 08:23:05 2014" "May 29 08:37:48 2014" "May 29 08:41:15 2014" "May 29 08:11:02 2014" 32768 8 0 tmp.txt


注意link也会改变ctime。

5、单独改变birthtime:

对于birthtime,你还是从了吧,至少这辈子不要改了,改了就是来世,成了另外一个文件,真想改的话也简单,复制一个再删除就成,已经脱胎换骨了。

6、两个说明

(1)在磁盘IO繁忙的系统中,比如数据库服务器、web系统,atime会拖累整个系统,并且在这些系统中我们并不关心atime,所以在这些系统中,最好把atime关闭掉,这样可以提升系统的一些性能。

方法就是在/etc/fstab中,添加noatime参数,当然也可以手动mount的时候添加这个参数:

cat /etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/ada0p2 / ufs rw 1 1
/dev/ada0p3 none swap sw 0 0
/dev/ada0p4 /home ufs rw,notime 2 2


(2)在复制的时候,windows和类Unix系统有所不同,windows保留了修改时间,而Unix下,一切都是新的,atime,mtime,ctime,btime,都是新的,这跟文件在磁盘上存储的方式有关,再要深究的话,就要去研究文件系统了。

该贴由hui.chen转至本版2014-11-5 17:04:59




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论