目录
一、yum工具1.yum背景知识(1)商业生态
在安装软件之前,须要先下载对应的软件的安装包,并且这个安装包并不存在于本地的计算机c盘,而是存在于远端服务器上。世界上的服务器多了,这么计算机是怎样晓得该软件存在于那个具体的服务器上呢?
对于笔记本来说,我们通常通过官网下载相应软件包;而对于手机来说,我们更多通过手机自带的应用商店来下载软件包。
但实际上应用商店这个软件就这么大,上面也不存在所有的软件包。所以应用商店只是存放着对应软件下载网站的链接,最后我们的软件包还是从对应的网站上下载的。
那些我们下载出来的软件包是由一些企业、组织或个人提供的。那些企业、组织以及个人为了某种利益编撰出了软件包,之后将其放到了对应的服务器上,供用户下载使用。
此后,一条简单的商业生态链就下来了:
一部份人编撰出了软件包供其他人使用,并通过收费或则外置广告等方法从中获取利益;同时,它们也向手机厂商或则第三方下载软件的公司支付费用,致使自己的软件就能出现在对应品牌手机的应用商店(例如:苹果AppStore)或则第三方的下载工具(例如迅雷等)中被下载使用。
(2)开源生态
有人编撰软件是为了挣钱,自然也有的人不为挣钱。有的人会将自己编撰出的软件包的源代码公开,让他人才能免费使用,这些就叫开源。
yum是Linux下常用的一种包管理器;主要应用在Fedora,RedHat,Centos等Linux发行版本上,软件包和yum,就相当于手机中的“App的安装包”和“应用商店软件”这样的关系。
在Linux之父托瓦兹编撰出了Linux操作系统并将其开源以后,越来越多的人参与到了Linux的建立与扩充中来,其中也不乏为Linux免费编撰软件的人;那些人会加入相应的Linux社区,之后将自己编撰的软件放到社区对应的服务器上;而不同的社区会在自己的Linux版本中外置服务器和软件对应的下载链接,而这个用于储存下载链接的软件就是yum。
里面的过程也是开源生态的产生过程–不同的Linux发行版创建对应的Linux社区,社区拥有一个公共帐户linux环境变量,用于接受来自世界各地的捐助,之后用帐户上面的资金订购服务器、举行各类活动等等;来自世界各地的具有开源精神的人将自己编撰的开源软件布署在社区的服务器上;社区再将这种软件的下载链接拷贝到对于Linux发行版的软件包管理器(例如yum)中,促使我们能否在Linux中通过软件包管理器安装使用各类软件。
(3)软件生态本土化
因为西方国家在计算机方面起步与发展比我国要早好多,所以我们前面所说的开源生态最先在西方产生,即大多数Linux社区,包括社区对应的服务器都是布署在美国的;所以在国外通过链接下载软件时访问会比较慢,再加上我国自有国情在,虽然梯子这些东西是违规的,有时侯想下载内网的软件都会访问失败。
针对前面这些情况,我国的一些院校以及公司就镜像(复制粘贴再加部份更改)了美国的软件服务,即把美国服务器上的软件拷贝到了国外的服务器上,促使我们可以直接访问国外的服务器就可以下载对应的软件。并且只拷贝软件也还不行,由于yum中下载软件时默认访问的链接还是美国的,所以这种院校/公司还提供了一套国外的下载链接配置文件–yum源配置文件。
在Linux中,yum源配置文件是存在于/etc/yum.repos.d/目录下的CentOS-Base.repo文件
假如你使用的是云服务器,这么yum源通常都是配置好的,假如你使用的是虚拟机,你须要打开CentOS-Base.repo查看上面的链接是否是国外的链接,倘若不是,就须要自己自动配置,配置的方美网上好多,直接搜索对应的Linux发行版即可。
这儿的镜像就都是腾讯网站下的安装包(tencentyum)
2.yum的基本使用(1)查看软件包
我们可以通过yumlist命令列列举当前一共有什么软件包可供安装(那种显示可安装程序的动图太大了传不上来……)
但软件包的数量太多,所以我们通常使用grep命令来筛选出我们须要的包,例如找到rzsz
(2)软件包名称构成
主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu构架
(3)安装软件
我们可以通过如下命令来安装软件包(其中-y代表不寻问直接安装)
格式:yuminstall-y软件名
rzsz工具用于windows机器和远端的Linux机器通过XShell传输文件,安装完毕以后我们可以通过拖放或则命令的形式将文件上传过去。
输入yuminstall-yrzrs,开始安装这个软件。不过这儿告诉我们这个软件早已被安装好了,不须要再度安装。
rzrs在我们官方软件的列表中,并且官方软件的列表只包含了一部份经过测试的运行稳定可靠的软件。有一些软件并没有被列入Centos、Ubuntu、Kail等相关生态平台的官方软件集合中,假如我们想使用这种软件,须要安装非官方软件集合列表:epel-realse
yuminstall-yepel-realse进行安装。不过这儿告诉我们早已安装了最新版本,不须要再度安装。
我们再度安装一个不在官方软件列表中的sl软件程序,它可以在屏幕上复印一列小高铁。
yuminstall-ysl
注意事项
(4)卸载软件
卸载软件的指令如下(其中-y代表不寻问直接卸载):
yumremove-y软件名
我们卸载掉之前安装的sl小列车
注意:关于yum的所有操作必须保证主机(虚拟机)网路畅通;可以通过ping指令验证网路:
二、vim编辑器1.认识vim
vim是Linux系统上一款强悍的文本编辑器,类似于我们windows里的记事本。因为使用它方便,高效的特性使它成为了目前最强悍的编辑器,而且它最大的缺点之一就是使用门槛较高。
2.模式及其切换
通过vim文件名的指令(比如:vimtest.c)可以用vim编辑这个文件。
vim有好多的模式,不同的模式适配于不同的操作,vim有好多好多的模式,我们主要涉及到五六个,我们优先讲解命令模式、插入模式和底行模式三个。
当打开vim时,默认是命令模式,此时虽然我们敲打按键,也并没有输入内容。
假如想要输入内容,我们须要在鼠标上敲Shift+i切换到插入模式。(左下角的INSERT表示插入模式)在这个模式下,我们就可以像记事本一样输入字符了。
此时,我们在插入模式下编撰好了一个程序,我们想要保存并退出须要先按左上角esc退回到命令模式,之后按Shift+:步入底行模式。
底行模式下输入wq就可以保存并退出了。
vim模式的切换一定是在命令模式下切换到其他模式,假如我们想从一个非命令模式切换到另一个非命令模式,我们须要按esc退回到命令模式再步入其他模式,不同的非命令模式不能直接切换。
详情见右图:
2.插入模式
插入模式容许我们像记事本一样输入内容,调节光标位置使用上下左右键。
Shift+i:从命令模式步入插入模式
Shift+a:从命令模式步入插入模式并将光标联通到最后一个字符后
Shift+o:从命令模式步入插入模式并换行
3.命令模式(1)光标定位操作(2)文本复制、粘贴、剪切、撤销(3)文本操作4.底行模式(1)基本操作(2)分屏编辑
(3)不退出vim,执行Linux指令(4)全局替换与查找
s代表替换,g代表全局。事例中表示将所有printf替换为cout。
使用/加查找内容即可进行内容的全局查找,事例中表示查找全局范围内所有的printf
5.vim配置(1)vim配置的原理
我们之前看见有一个指令称作:setno用于显示行号。假如我们想让vim默认就打开行号就须要对vim进行配置。
每一个用户在自己的家目录下,有一个属于自己的配置文件,所有的配置都写在这个文件内,称作.vimrc(隐藏文件,须要自己创建)。所以,尽管每一个用户都使用同一个vim软件,而且不同用户使用自己的vim配置永久免费linux服务器,互不影响。
比如在.vimrc中新增行号功能,可以在.vimrc中写入setnu,保存退出。再度打开vim就加入行号了
(2)vim一键配置
可以在gitee中搜索VimForCpp后,将该链接直接复制粘贴在shell中执行,即可完成配置。
curl-sLf-o./install.sh&&bash./install.sh
配置前的vim非常难用,配置后的vim就便捷好多了。
不过这个vim配置中换行默认缩进两个空格,假如想改变为4个空格的话可以把这三行的数字的2改为4(我的早已改过了)
6.将普通用户添加至信任列表
(1)使用root用户登入
(2)使用vim打开/etc/sudoers
(3)找到大概100行
(4)复制里面的内容到下一行之后更改背部的用户
(5)底行模式输入w!强制保存,之后输入q!强制退出
这样我们的example用户就被添加到信任帐户后,普通用户也可使用sudo加壳。
三、gcc/g++编译器1.程序的编译和运行
一个C程序的编译和运行要经过下述步骤:
预处理(每位C语言源程序进行头文件的包含、注释的删掉与宏的替换)→编译(每一个文件生成汇编代码)→汇编(生成机器可辨识代码)→连接(生成可执行文件或库文件)
详情请见博客:(1条消息)程序的编译和运行_聪明的勇士的博客-CSDN博客_编译运行
2.使用gcc工具完成操作
格式:gcc+[选项]+要编译的文件+[选项]+[目标文件]
(1)预处理
预处理功能主要包括宏定义、文件包含、条件编译和删掉注释等。
格式:gcc+-E+文件+-o+[目标文件]
实例:gcc–Etest.c–otest.i
输入指令后ll可以看见新出现了一个test.i的文件,这就是test.c经过预处理后的文件
我们用vim打开test.i和test.c,发觉stdio.h的内容早已被拷贝到文件中了,注释条件编译等也不在了
(2)编译(生成汇编)
在编译阶段,gcc首先要检测代码的规范性、语法的正确性等,以确定代码的实际要做的工作,在检测无误后,gcc会把代码翻译成汇编语言。
格式:gcc+-S+文件+-o+[目标文件]
实例:gcc–Stest.i–otest.s
输入指令后ll可以看见新出现了一个test.s的文件,这就是test.c经过预处理后再编译后的文件
用vim打开产生的test.s和test.c,我们不须要读懂汇编代码,大约其晓得其中的一些指令譬如说:call是函数调用,push是压栈等就足够了。
(3)汇编(生成机器码)
在汇编阶段,gcc把编译阶段生成的“.s”文件转成目标文件,此时的文件都由01组成,是计算机可以读懂的二补码文件。
格式:gcc+-c+文件+-o+[目标文件]
实例:gcc–ctest.s–otest.o
同样用vim打开test.o文件,内部全是乱码,这是由于在产生二补码机器码的阶段会有加密
(4)联接(生成可执行文件或库文件)
在成功编译以后,就步入了链接阶段,联接起不同的.o文件最终产生可执行程序。
格式:gcc+文件+-o+[目标文件]
实例:gcctest.o–otest
链接后,运行生成的test可执行程序
3.函数库(1)对链接的新认识
在我们的C程序中,并没有定义printf的函数实现,那我们是如何使用printf函数的呢?
你可能会说,是由于在预处理中stdio.h的内容被复制到文件中,头文件中包含了这个函数的定义。
然而,虽然stdio.h头文件中也是只有printf函数的申明,没有定义函数的定义,那究竟是在那里定义的“printf”函数的呢?
虽然,系统把这种函数的定义都放在了libc.so.6的库文件中去了,在没有非常指定时,gcc会到系统默认的搜索路径“/usr/lib”下进行查找,也就是相当于链接到libc.so.6库函数中去,这样才能找到函数printf的定义了。
之前,我们在一个C语言程序的编译和运行中,我们以前讲过链接是把经过编译后的各个文件的内容关联上去,在这儿我们要认识到链接不只是.c文件,还有库文件的参与,而这也就是链接的作用——将自定义函数对不同的.c文件进行联接,对库函数与库进行链接。
(2)动态链接和静态链接
如同我们去图书馆,图书馆里有各类各样的书可以供你阅读。例如说,你在图书馆里发觉了一本好书,而且没有经过图书馆管理员的借书准许,你就只能在图书馆里去看这本书。
假如你不想每次都挪到图书馆去看书,这么你就可以自己买一本同样的书,就可以带着这本书到任何地方去看。
同样对于动态链接,我们须要某一个函数的定义就可以直接到相应的库里去找,就不须要把库中的函数实现拷贝一份到程序文件中,降低了程序抢占的储存空间大小。并且每次遇见某个函数的定义都要再去对应位置找寻,增加了程序的运行效率。
而对于静态链接,我们就须要把库中的函数实现拷贝一份到程序文件中,我们也不须要去对应的库中找寻函数定义,降低了程序的运行效率,而且又大大降低了程序抢占的储存空间大小。
所以我们好多时侯会发觉我们下载安装的应用程序会越来越大,不仅我们自己使用留下的数据,还有一部份就是软件在你不知情的情况下将一些通过动态联接的代码下载到了本地,致使应用程序占用的储存空间越来越大。
(3)静态库和动态库
静态库是指使用静态链接时,库中文件的代码全部加入到可执行文件中,这个被加载的库就是静态库。静态编译的程序在运行时不再须要库文件的查找。在Linux下静态库的后缀名通常为.a,Windows下为.lib
动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这个须要被查找的库就是动态库。在Linux下动态库通常后缀名为“.so”,Windows下为.dll。
后面的libc.so.6就是个动态库。并且gcc在编译时默认使用动态链接生成可执行文件
输入gcctest.o–otest,之后输入filetest查看程序的联接属性
Linux上(Windows上也这么)gcc默认生成的可执行程序,是动态链接的(dynamicallyLinked)。
(4)静态链接产生可执行程序
假如我们就想让test.c静态链接产生可执行程序可通过下边的句子实现:
格式:gcc源文件-o可执行程序名-static
四、项目手动化建立工具Make/Makefile
这一部份理解上去不太轻松,须要细细寻思
1.Make/Makefile的介绍
make是一条命令,makefile是一个文件linux应用软件开发,两个搭配使用就可以完成项目的手动化打造。
make/makefile主要用于管理小型项目的各类文件,我们如今写的程序最多也就五六个文件,并且一个小型工程中的源文件多达上千个。
其中makefile是用于保存协调项目内文件运行的规则的文件,make指令是用于解释makefile手指令的命令。通常来说,大多数的代码集成开发环境都有像make这样的命令,例如:Delphi的make,VisualC++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方式。
3.Make/Makefile的简单使用(1)Makefile文件的编撰
我们写一个乘法表,用main.c,add.h,add.c三个文件实现。
//add.h
#include
int Add(int x, int y);
//add.c
#include"add.h"
int Add(int x,int y)
{
return x+y;
}
//main.c
#include"add.h"
int main()
{
int i = 1;
for (i=1; i<9; i++)
{
int j = 1;
for (j=1; j<=i; j++)
{
printf("%d+%d=%d",i,j,Add(i,j));
}
}
return 0;
}
编撰makefile,最重要的是理解依赖关系和依赖方式。
依赖关系是指一个文件依赖另外一个文件,即想要得到一个文件,目录下必须先有另外一个文件
依赖方式则是指怎么按照依赖文件来得到目标文件。
构建一个Makefile文件,注意文件名必须是makefile或Makefile,不能是其他名称,否则make不能辨识。
这是乘法表的Makefile编撰:
依赖关系——目标文件:依赖文件
目标文件add_map.out依赖对应的依赖文件(也可以叫源文件)add.c和main.c,因为预处理早已完成了头文件的包含,所以不须要写上头文件。
这只是个反例,依赖文件可以有多个,也可以没有。
例:add_map.out:tadd.cmain.c
依赖方式——源文件产生目标文件须要执行的指令(gcctest.c-otest.out)
依赖方式是gcc编译,依赖方式的执行指令必须以[Tab]键开头,非常注意不能是四个空格。
例:[TAB]+gcctest.c-oadd_map.out
伪目标——.PHONY
例:
.PHONY:clean(clean可替换)
clean:(clean替换,这儿也要替换)
rm-fadd_map.out
clean不依赖任何文件,依赖方式是rm-f指令;其中.PHONY修饰clean表示其是一个伪目标,伪目标总是被执行。
(2)Makefile的使用
仍旧以上一个Makefile运行
输入指令:make
make代表执行第一个依赖关系下的所有方式。
输入指令:makeclean
可以发觉上面生成的test.out可执行文件早已被清除
伪目标有总是被执行的特性linux应用软件开发,非伪目标指令表现为执行这个指令在结果上并没有改变那就不再执行这个指令,而伪目标的指令一定会被执行。
大约举个反例:
我们可以在命令上多次输入make,可以发觉它并没有帮我们执行,由于add_map.out早已存在了,但是源文件也没有被更改,虽然你再度生成可执行程序它最后结果上也是生成一模一样的可执行程序,所以系统认为没必要编译多次,对应的依赖方式也就不会被加载到系统中。
然而伪目标就不行了,输入makeclean,clean对应的指令只要你输入就一定会执行。清除项目的指令执行多次也没事儿,假如没有对应的文件,系统直接忽视就好了。
再度解答一下为何clean须要写成makeclean,而编译直接写make就可以了。
假如我们把Makefile中的clean联通到第一行,再去make,此次make执行的是rm-rfadd_map.out这条命令。这就说明了在Makefile中,执行make命令的时侯,不指定具体目标,它都会默认执行第一个目标。
4.make智能辨识的原理
make是如何晓得我的源文件没有被更改因而不让我多次make,那它靠哪些辨识呢?
理解这个的原理,我们须要一个查看文件的属性信息的命令
格式:stat+文件名
例如我们查看main.c文件的属性
可以看见AccessModifyChange三个时间(以时间戳存储),它们的初始时间记录都是文件被创建的时间。
change时间会遭到modify行为的影响,由于假如向文件写入内容,表示着它的大小会变化,顺带改变了它的属性。
按照了解里面的知识,虽然make指令就是按照生成的可执行程序的更改时间,之后再依据源文件更改时间进行判别的。
假如可执行程序的时间比源文件的时间要更新或则说更晚,就不会进行重新生成可执行程序,因而降低毋须要编译过程。
这儿我们就可以理解所谓的“伪目标”,虽然就是被.PHONY修饰的目标不遵守里面的时间判定规则,只要你输入了,它就一定会执行。
5.Make/Makefile实例的执行过程
在默认的形式下(只输入make命令),make都会在当前目录下找名子叫“Makefile”或“makefile”的文件。假如找到对应文件,它会找文件中的第一个目标文件(target),在里面的事例中,他会找到“main.c和add.c”作为依赖文件。
假如add_map.out的可执行程序文件不存在,或是add_map.out的可执行程序所依赖的依赖文件(本事例中是两个.c文件)的更改时间要比目前存在的可执行程序新,这样,他就会执行前面所定义的命令来世成add_map.out的可执行程序的目标文件,依赖文件不会被消除。
假如add_map.out的可执行程序文件所依赖的.c文件也不存在,这么make会在当前文件中找目标为.o文件的依赖性,假如找到则再按照那一个规则生成.o文件。(这有点像一个堆栈的过程)
我把其中一个依赖文件经过编译产生.o文件,这个.o文件也可以被辨识并产生可执行程序,只要你的文件是可以和原先的依赖文件产生指令的关联的,那就make可以运行。
整个make是有依赖性的,从可执行程序开始,make会一层又一层地去找文件的依赖关系,直至最终编译出第一个目标文件。(例如说:test.c
make只会检测文件的依赖性,假如在我找了文件的依赖关系以后,逗号旁边的依赖文件如何也找不到,那就甭提别的,我不干了。
像clean这些,没有被第一个目标文件直接或间接关联,这么它前面所定义的命令将不会被手动执行,不过,我们可以显示要make执行(makeclean),消除所有的目标文件,便于重编译。
于是在我们编程中,假如这个工程已被编译过了,当我们更改了其中一个源文件,甚至是头文件,只要文件更改时间要比早已生成的可执行程序要新,这个可执行文件都会被重新生成。
五、gdb调试工具1.哪些是gdb
GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强悍的程序调试工具。对于一名Linux下工作的c++程序员,gdb是必不可少的工具。
2.debug和release
(1)Debug称为调试版本,它在源代码的基础上不作任何优化,以便程序员调试程序。
(2)Release称为发布版本,它常常是对程序进行了各类优化,比如减少程序大小和推动运行速率等,便于用户挺好地使用。
(3)这两种状态下的代码运行结果可能会不同。
只有debug版本的程序能够调试,gcc默认生成的程序是release版本的,假如想生成debug版本的可执行程序可以在编译句子前面加上-g
输入:gcctest.c-otest-g
test就是生成的debug文件
3.gdb调试代码
以调试test为例,简单说明最基本的几个命令,前面是VS上的调试方式,下边是gdb的操作方式。源码如下:
#include
int main()
{
int i = 1;
for (i=1; i<10; i++)
{
int j = 1;
for (j=1; j<10; j++)
{
printf("%d×%d=%d",i,j,i*j);
}
printf("n");
}
return 0;
}
(1)步入调试
在VS中步入调试可以按F5、F10、F11都可以步入调试
格式:gdb+可执行程序文件
输入:gdbtest步入调试,步入gdb就可以输入指令了
(2)显示源代码
格式:list/l
list展开源代码的前十行,假如还想见到前面的内容可以点击Enter十行十行展开
(3)断点的添加、删除和信息显示
在visualstudio中我们用F9添加断点,设置断点的行后面会有一个白色圆圈
格式:break+代码行数/b+代码行数
输入:b7相当于在第四行添加断点
在visualstudio添加断点后可以右键点击红点设置条件,在符合该条件的情况下才停止运行
格式:break+代码行数+if+条件/b+代码行数+if+条件
输入:b6ifi==5就在第六行加入了一个条件为i==5的断点,运行后正好停在相应位置。
在visualstudio中我们用设置断点的行后面的白色圆圈指示断点的位置,右击查看条件信息
格式:infobreak/infob
输入:infob查看断点
在visualstudio中删掉断点在相应行按F9即可
格式:delete+断点编号/del+断点编号
输入:del1就删掉了一号断点
(4)run运行调试程序与continue继续运行
在visualstudio中我们用F5运行到断点处,而ctrl+F5是开始执行不调试,相当于不打开gdb直接运行debug程序。
格式:run/r
输入:r开始运行到第七行intj=1;
然而run是指运行一个程序,假如抵达了断点还想要继续向上运行就须要continue句子。
格式:continue/c
输入:c继续运行至断点或则程序结束
(5)逐句子和逐过程调试
next为gdb的单步调试,当遇见函数调用时,不步入函数体,相当于VS的F10
格式:next/n
next为gdb的逐句子调试,当遇见函数调用时,不步入函数体,相当于VS的F10
格式:step/s
step为gdb的逐过程调试,当遇见函数调用时,步入函数体,相当于VS的F11
不管是逐过程还是逐句子,它们都须要在输入run指令让程序运行上去后才可以使用。
(6)查看某个变量的值
在调试过程中,我们须要查看当前某个变量值的时侯,可使用print命令显示该值,而且只能显示一次上次不会再显示。
格式:printvar(var表示任何一个变量或表达式)
在调试过程中,我们须要查看当前某个变量值的时侯,可使用print命令显示该值,而且只能显示一次上次不会再显示。
格式:displayvar(var表示任何一个变量或表达式)
使用display命令就可以仍然显示该值。
(7)退出gdb
VS中退出调试可以输入Shift+F5
格式:quit/q
4.其他命令
还有好多其他的命令,可以自己去试一试。
六、进度条程序1.后置知识(1)r&&n
回车概念(r)——回车是把光标移到一行的开始
换行概念(n)——换行是跳到下一行的开始
(2)行缓冲区
我们定义一个test.c文件,代码如下:
#include
#include
int main()
{
printf("%hello worldn");
sleep(3);
return 0;
}
结果复印了helloworld也换行了,之后才睡眠三秒
我们稍加改变
#include
#include
int main()
{
printf("%hello worldr");
sleep(3);
return 0;
}
我们发觉程序等待了一会儿,哪些也没复印下来,这么helloworld的内容去哪儿了呢?
这儿就出现了缓冲区的概念,虽然在之前的C程序中也说过缓冲区,只是没有借助过计算机的这个特性。这个helloworld被放到了缓冲区中没有被掏出来放在屏幕上,我们也就哪些都看不到。
再添加一个刷新缓冲区的函数
#include
#include
int main()
{
printf("%hello worldr");
fflush();
sleep(3);
return 0;
}
程序就直接把数据复印下来再睡眠了。
控制台是一个输出设备,我们可以看见有一个光标随着输出去动下。数据先输出到缓冲区内,之后通过fflush清空缓冲区,输出最后带上一个r让光标回到开头,同时因为缓冲区被清空,新的数据又被加载进缓冲区。之后再度清空缓冲区输出到屏幕,这时的输出相当于还在本行开头输出,将原先的内容再度输出到屏幕就相当于覆盖掉原先输出的部份内容。就这样不断地输出覆盖,产生一个动态的进度条。
(3)各文件内容
Makefile
progress_bar:progress_bar.c
gcc progress_bar.c main.c -o progress_bar
.PHONY:clean
clean:
rm -f progress_bar
main.c
#include"progress_bar.h"
int main()
{
proc();
return 0;
}
progress_bar.c
#include"progress_bar.h"
void proc()
{
int i = 0;
char arr[101];
const char* p = "|/-\";//定义一个数组,让它每次从头到尾打印数组的元素就可以做到旋转的效果
memset(arr,'',sizeof(arr));//把所有内容都设置为
while(i<=100)
{
printf("[%-100s][%d%%][%c]r",arr,i,p[i%4]);//注意控制格式
fflush(stdout);//刷新缓冲区
arr[i++] = STYLE;//每次把一个替换为STYLE对应的符号
usleep(20000);//睡眠一段时间,usleep的睡眠时间以毫秒为单位
}
printf("n");
}
progress_bar.h
#include
#include
#include
#define STYLE '#'
extern void proc();
成果如下:
七、git上传代码1.git的介绍
git是一个版本控制器,当我们开发一个项目时,须要写好多好多的文件。那些文件管理上去很麻烦,所以我们可以上传到某一个网站上他来帮我们管理,我们可以上传也可以取。同时,假如我们更新了一个或则几个文件,这个网站会帮我们比对上一个版本和这个新版本的区别并更新到这个版本,原来的版本也是可以看见和取到的。这样的版本管理网站就是版本控制器,git就是其中之一。
2.git的历史
直至2005年4月,我们的Linux之父雷纳兹·托瓦兹在开发完Linux后,世界各地的志愿者开发团队都在为Linux更新代码以增强其运行效率和稳定性,托瓦兹自己管理着庞大的Linux内核源码,这是一个相当复杂的工作。
于是托瓦兹就与当时的付费的版本控制器BitKeeper(BK)协商,对方也同意了Linux的代码管理可以免费使用她们公司的版本控制器。并且,有一些Linux社区的开发人员企图去破解BitKeeper,这引起了BK的创始人LarryMcVoy的不满,取消了免费使用的授权。
此时托瓦兹又须要自己去管理源码了。最后托瓦兹和Linux社区内的大鳄们模仿BitKeeper自己开发了一个免费的版本管理器并公诸于世,这个写成的版本管理器就是Git。而Git经过商业化改建就产生了现今美国的Github和国外的Gitee
3.git的使用(1)安装
我们的Linux系统中可能没有预装git,须要安装,我的早已安好了。
yuminstall-ygit
(2)gitee上传代码的打算工作
因为在国外访问Github链接非常不稳定,我们更多使用的还是Gitee
在注册登录后界面是这样的(图片是在网上找的):
点击右上角的减号,之后点击新建库房,根据下边的操作执行就好
初始化库房等根据下边的按就可以了
这样我们就创建好了一个库房,我给它起名叫Linux
点击右上角的管理,到最下边设置库房为公开并选择对应的许可证就可以了
(3)下载项目到本地
将云端的数据拷贝到当前机器上
格式:gitclone+库房的https链接