make/Makefile - ACM 时间及 make 的检查更新

一、ACM 时间

Linux 下文件属性中有 ACM 时间来表示文件的最近读取时间(Access),改动时间(Change),修改时间(Modify)。
使用 stat 指令可以看到某个文件的这三个时间:

在这里插入图片描述

修改时间

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

在这里插入图片描述
通过 vim 打开 test.c 文件并修改后,发现 test.cModify 时间发生了改变。(其余两个时间也发生了改变,后面会说到)

改变时间

改变世界(Change)指的是对文件的属性进行了修改后,紧跟着更新的时间。

  • Change 和 Modify 时间的区别
    在这里插入图片描述
    修改文件内容,更新的是 Modify
    修改文件属性,更新的是 Change

  • 文件属性

在这里插入图片描述
上图所显示的都是文件属性(文件名也属于)。

  • 属性改变

在这里插入图片描述
上图属于直接修改文件属性后造成的 Change 时间的更新。

  • Change 和 Modify 联动

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

在这里插入图片描述

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

在这里插入图片描述

读取时间

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

  • Access 的跟新

在这里插入图片描述
可以看到,通过 cat 指令对文件内容进行查看之后,Access 时间进行了更新。从之前的图片中,我们也能看到当使用 vim 访问文件后,Access 时间也进行了更新。

  • Access 的更新规则

Access 不是每次访问都改动的,而是有一定的时间间隔。

在这里插入图片描述
从上图看,中间查看过一次,但 Access 并没有更新。

其实这是为了效率进行的改进策略。

  1. 更新方面: Access 时间属于文件属性,而文件属性属于数据,更改它是有消耗的。
  2. 访问方面:
    如果每次访问都更新,那每次都要让操作系统向磁盘文件中,属性中的 Access 更改,压力会很大(虽然 ModifyChange 也是这样,但它俩的改动的频率要小的多)。
    如果是一个文件的高频访问可能还好,但多个文件的高频访问,会负担更大。
    而且,对于 Access 的更新必须是实时的,压力会更大。

所以,为避免低效,采取一定方法避免每次都更新。

统一更新时间

可以使用 touch 指令进行三个时间的统一更新,如下图:

在这里插入图片描述
touch 指令还有新建文件的作用:
在这里插入图片描述

touch 指令的作用总结:
在这里插入图片描述

二、make 会检查文件的新旧

现象

  1. make 形成可执行程序

在这里插入图片描述
通过make指令,我们发现它自己实现了 gcc -o test test.c 的命令操作,生成了名为 test 可执行程序。

  1. 再次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 文件,问题仍然存在。


本文到这里就结束了,如果对您有帮助,希望得到您的一个赞!🌷
如有错漏,欢迎指正!😄

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值