您的位置:

深入解析 Linux ctime

一、概述

Linux ctime,即 Change Time,是指 Linux 文件系统记录每个文件或目录的最近状态更改时间,也就是说,当文件或目录的权限、所有权、内容等发生更改时,其 ctime 属性就会被更新。与之相似的还有 access time 和 modification time

二、 ctime 属性分析

1. 创建文件、修改属性

当文件或目录被创建时,他们的 ctime 属性会被设置为当前时间。具体的实现是在 ext3、ext4、xfs 等文件系统的 inode 中的 i_ctime 字段记录下这个时间。当文件或目录的某些属性被修改时,如权限、所有权等,也会使其 ctime 属性被更新。

#include 
#include 
   

int main() {
  const char* path = "/path/to/file";
  struct stat file_stat;

  stat(path, &file_stat);
  printf("ctime: %ld\n", file_stat.st_ctime);

  return 0;
}

   
  

2. 文件内容修改

如果文件或目录的内容被修改,则其 ctime 属性依然会被更新,但需注意的是,当文件内容被修改,但该文件不保存在内存中时,操作系统会将该文件从磁盘中读取到内存中,此时的 ctime 是读取时间而非修改时间。

#include 
#include 
   
#include 
    
#include 
     
#include 
      

int main() {
  const char* path = "/path/to/file";
  struct stat file_stat;
  int fd;

  fd = open(path, O_RDWR);
  write(fd, "hello world", 11);
  stat(path, &file_stat);
  printf("ctime: %ld\n", file_stat.st_ctime);

  close(fd);
  return 0;
}

      
     
    
   
  

3. 删除文件或目录

当文件或目录被删除时,其 ctime 属性会被修改,但这个时间并不是文件或目录真正被删除的时间,而是它的目录的 mtime 字段所记录的时间,原因是 Linux 文件系统将每个文件或目录都看作是目录树的一个节点,当节点的文件或目录被删除时,该节点所在的目录的 mtime 就可以被更新。

#include 
#include 
   

int main() {
  const char* path = "/path/to/file";
  int ret;

  ret = unlink(path);
  if (ret == 0) {
    printf("File %s is deleted successfully.\n", path);
  } else {
    printf("Failed to delete file %s.\n", path);
  }

  return 0;
}

   
  

三、小结

实际上,ctime 是文件或目录的状态修改时间,而不是内容修改时间,它包括了文件或目录的创建、属性更新和删除时间等。了解 ctime 的特点与用法,对于 Linux 文件系统管理和调试都是非常重要的。