文章目录
- 一、ACM 时间
- 修改时间
- 改变时间
- 读取时间
- 统一更新时间
 
- 二、make 会检查文件的新旧
- 现象
- gcc 没有检查的功能,这个工作是 make 干的
- make/Makefile 通过对比时间了解可执行程序是不是最新的
- 新的可执行程序和新的 .o 文件
 
一、ACM 时间
Linux 下文件属性中有 ACM 时间来表示文件的最近读取时间(Access),改动时间(Change),修改时间(Modify)。
 使用 stat 指令可以看到某个文件的这三个时间:

修改时间
修改时间(Modify)指的是对文件的内容进行了修改后,紧跟着更新的时间。

 通过 vim 打开 test.c 文件并修改后,发现 test.c 的 Modify 时间发生了改变。(其余两个时间也发生了改变,后面会说到)
改变时间
改变世界(Change)指的是对文件的属性进行了修改后,紧跟着更新的时间。
-  Change 和 Modify 时间的区别 
  
 修改文件内容,更新的是Modify
 修改文件属性,更新的是Change
-  文件属性 

 上图所显示的都是文件属性(文件名也属于)。
- 属性改变

 上图属于直接修改文件属性后造成的 Change 时间的更新。
- Change 和 Modify 联动
有时我们没有直接改动文件属性,但 Change 时间也发生了改变,这说明文件属性间接被改变了,比如上面介绍 Modify 时间时,通过 vim 改变文件内容后,Change 时间也发生了改变,因为修改文件后,文件的大小发生了改变,文件大小也属于文件的属性,如下图:

所以 Modify 和 Change 的时间有时候会联动,两者关系大概如下:

读取时间
读取时间(Access):指的是对文件查看之后,紧跟着更新的时间。
- Access 的跟新

 可以看到,通过 cat 指令对文件内容进行查看之后,Access 时间进行了更新。从之前的图片中,我们也能看到当使用 vim 访问文件后,Access 时间也进行了更新。
- Access 的更新规则
Access 不是每次访问都改动的,而是有一定的时间间隔。

 从上图看,中间查看过一次,但 Access 并没有更新。
其实这是为了效率进行的改进策略。
- 更新方面: Access时间属于文件属性,而文件属性属于数据,更改它是有消耗的。
- 访问方面:
 如果每次访问都更新,那每次都要让操作系统向磁盘文件中,属性中的Access更改,压力会很大(虽然Modify和Change也是这样,但它俩的改动的频率要小的多)。
 如果是一个文件的高频访问可能还好,但多个文件的高频访问,会负担更大。
 而且,对于Access的更新必须是实时的,压力会更大。
所以,为避免低效,采取一定方法避免每次都更新。
统一更新时间
可以使用 touch 指令进行三个时间的统一更新,如下图:

 touch 指令还有新建文件的作用:
 
touch 指令的作用总结:
 
二、make 会检查文件的新旧
现象
- make 形成可执行程序

 通过make指令,我们发现它自己实现了 gcc -o test test.c 的命令操作,生成了名为 test 可执行程序。
- 再次make:

紧接着 make ,发现有提示,表明源文件已经是最新的了。
 源文件没有改动,即使make ,也不会重新编译,源文件改动了,make 才会重新编译。
gcc 没有检查的功能,这个工作是 make 干的
那么,这个检查 test 文件是不是最新的工作,到底是 make 做的还是 gcc 做的呢?

 如上图,我们可以看到多次 gcc 但并没有弹出已经到最新的消息,所以可以肯定是 make 在做检查工作。
make/Makefile 通过对比时间了解可执行程序是不是最新的
test 的修改时间只要比 test.c(源文件)的新,就表明 test 是最新的了,不用再编译覆盖当前的 test 文件了。
 两者的修改时间一定是不一样的,所以可以做对比。
- make 对比的是 Modify 时间:
 如下图,修改过源文件的权限后,源文件的Change的时间已经比test的新了,但仍然表示是最新状态了,所以对比的不是Change时间。

 如下图,修改过源文件的内容后,源文件的 Modify 的时间已经比 test 的新了,此时不再显示是最新状态了,可以重新编译了,所以对比的其实是 Modify 时间。

新的可执行程序和新的 .o 文件
一个可执行程序需要多个源文件链接,编译链接文件后形成了可执行程序,但后面修改了几个源文件,需要再次编译链接形成一个新的可执行程序,但再次编译时,它会只编译那几个改动过的源文件,形成新的 .o 文件,再跟其他的未动的之前的 .o 文件链接,形成新的可执行程序。
 某个源文件中代码有点问题,运行结果出错,改动后,重新编译后运行仍然出错,可能是因为没有很好的识别时间(文件多)/其他问题,导致仍然链接的是旧的.obj 文件,问题仍然存在。
本文到这里就结束了,如果对您有帮助,希望得到您的一个赞!🌷
 如有错漏,欢迎指正!😄



















