1.进度条在生活中很常见,在linux系统中实现一个进度条的程序,感觉还是很有趣的
2.首先,进度条的动态是利用人们的视觉效果产生的,其实并不是像我们看到的那样,每次给后增加一个进度条,而是一个覆盖输出的过程;
先输出:[= ]表示进度是1%,刷新之后
再输出:[== ]......
由于刷新的速度很快,所以在人眼看来是不断地向后递增的过程!
3.实现之前我们先来了解一些知识:
(1)缓冲区
缓冲区分为无缓冲、行缓冲、全缓冲。
无缓冲:表示的是没有缓冲,可以将信息立马显现出来,典型代表是标准错误流stderr。
行缓冲:表示的是输入输出遇到换行才执行真正的I/O操作。典型的代表是键盘的操作。
全缓冲:表示的是输入输出写满缓冲区才执行I/O操作。典型的代表是磁盘的读写。
(2)回车换行
回车用'\r'表示,表示的是回到这行的起始位置。
换行用‘\n’表示,表示的是换行到下一行。
所以我们一定要清楚linux下的回车换行不是一个符号实现的;而是要用两符号‘\r’和'\n'联合实现的;
在C语言中,刷新缓冲区的函数是fflush函数,强制刷新缓冲区。实现这个进度条应使用的是无缓冲,实时的将进度条的变化显现出来。
在这里,不需要换行‘\n’,只需要回车'\r',每次将光标返回到原始位置。
4.代码
fflush()清空缓存区,c语言言的缓存区是以行的形式进行储存的读取,所以在没有遇到\n之前,缓存区不会将数据送到显示器上打印出来;所以需要强制刷新缓冲区,实时的将进度条变化显示出来;'\r'是直接回退到首部,不断覆盖;
5.写Makefile
(1)编译过程:
①预处理:(宏替换,去注释,头文件展开,条件编译)------>干净代码-------> 产生test.i 文件 -E
②编译:(c语言代码变为汇编语言)------->产生汇编语言 ---------->产生test.s文件 -S
③汇编:
将汇编语言----->生成机器可识别代码(二进制机器语言),此时二进制不能执行 ------>产生 test.o(中间目标文件) -c
(cup记住了二进制语言,认知二进制,cpu里面有自己的二进制指令集)
动态链接(程序主动调用库,库是公有的);
动态链接:不需要拷贝库函数,自身程序比较简单;体积小;但是可移植性差;需要调用库函数,实现起来麻烦;
静态链接:需要拷贝库函数给自身,自身携带任何方法,体积大,可移植性强;
gcc编译程序默认是动态链接;生成的可执行文件小;
(2)Makefile第一种写法(直接由源文件proc.c------>可执行程序test,省略中间的预处理,编译,汇编,链接的过程)
(3)makefile第二种写法
(4)make--->生成可执行程序test
(5)./test----->运行可执行程序
(6)make clean----->删除test,为重新执行其他代码清理
(见上图)