《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秒,更改时间修改为程序执行时的时间。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值