一、本章重点
1、复习Linux项目自动化构建工具make/Makefile
2、stat命令
3、写一个进度条
01 make/Makefile
首先需要了解的是:make是个命令,Makefile是个文件
直接上怎么使用
Makefile文件里写的都是依赖关系和依赖方法
依赖关系:mytest:test.c、clean:空
依赖方法:gcc test.c 0o mytest、rm -f mytest
clean这个目标文件被.PHONY修饰了,我们一般称被.PHONY修饰的目标文件为伪目标。
作用:让clean的依赖方法总是被执行。
具体什么是总是被执行,我们先来了解什么是可能不被执行。
当mytest为最新的目标文件就不再执行对应的依赖方法了。
这里可以继续深入了解一下如何判断mytest是最新的可执行程序呢?
先介绍一下"ACM时间"
Access:代表的是最新访问时间
Modify:代表文件内容的最新改变时间
Change:代表文件属性的最新改变时间
当我们修改test.c的属性数据时,只有Change值发生了变化。
现在我们可以解释的是,如果可执行程序比源文件的内容Modify时间晚,说明源文件就是最新的,就不需要重新生成可执行了,因此就不再执行依赖方法了。
如果给mytest加上.PYHONY(类是于关键字),那么mytest对应的依赖方法总是被执行的,说明白点就是不管最不最新,都执行mytest的依赖方法。
但我们一般不用.PHONY修饰可执行程序,因为这样可能会有效率的损失。
需要知道的是:一般使用make命令都是 make + 目标文件/伪目标 ,但第一行的目标文件可以省略,也就是可以直接make,而不用make mytest(可以用)。
还有一个值得提问的问题:为啥.PHONY要修饰clean呢?
clean不被.PHONY修饰不是也能总是被执行吗?
这里我把.PHONY给去掉了,然后在试试
不给clean添加.PHONY视乎也能总是被执行,但下面这总情况就不能总是执行了。
如果当前目录下有clean文件,那么make clean就不能总是被执行了
因为clean没有依赖,按说每次都会执行,但是由于当前文件夹存在clean文件,要拿clean文件和目标相比哪个更新,但是由于没有目标,make始终认为clean文件是最新的,因而不会执行相应的rm命令。
02 stat
功能:显示文件详细信息,可显示三种时间。
Access:代表的是最新访问时间
Modify:代表文件内容的最新改变时间
Change:代表文件属性的最新改变时间
Access有点特殊
按理说,访问了test.c文件,那么Access时间也会改变,但上面的Access并没有改变,这是因为我们访问test.c的操作可能是最频繁的,如果不断的修改Access时间,就得不断的进行io操作,这样会降低效率,因此在最新的Linux内核只会当访问test.c足够多的次数之后,才会去修改Access时间。
03 进度条小程序
如果要严格区分换行和回车
换行:
回车:
严格来说\n是指回车+换行,但现在一般都叫它换行,\r叫做回车。
1、需要美观的话,可使用printf进行颜色输出。
2、 同时关于使用fflush刷新缓冲区的问题,会在后面详细解答。