文章目录
- 一、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
文件,问题仍然存在。
本文到这里就结束了,如果对您有帮助,希望得到您的一个赞!🌷
如有错漏,欢迎指正!😄