文章目录
市面常见操作系统
❤Windows: 闭源;不安全
❤Mac: 闭源
❤Linux:开源
❤鸿蒙(国产)
【注意】闭源系统不安全,因为你使用闭源系统时,无法访问系统内部源代码,因此不知道系统内部是否隐藏其他盗取你信息的命名;
一. LINUX——入门知识点
1. 基本概念
-
Linux核心理念:万物皆文件;
-
Linux:是一个内核,而不是一个操作系统;Ubuntu、CentOs
等才是操作系统的名字,他们都使用Linux内核; -
~ :
①当前工作位置
②为用户主目录 -
两种权限:
# : 超级管理员
$: 普通用户
2. Linux命令
2.1 命令终端:
终端: 也称终端设备,是计算机最外围的设备,主要获取用户信息的输入以 及处理结果的输出等;终端是一个设备。终端最重要的事情是输入和输出,程序运行的结果要通过shell显示在终端上以此和用户产生交互
shell: shell是一个程序、主要就是获取用户输入的命令并运行,把结果返回给用户
terminal: 终端工具;
2.2 Linux命令分类:
①内部命令: 属于Shell解释器的一部分,是shell程序自带的命令(系统自带的,可直接执行)
②外部命令: 独立与Shell解释器之外的程序文件,是在系统的某个路径下的可执行程序,由shell依照事先设定好的路径查找,找到后才能执行(自己写的或者下载的,要自己下载好/写好后才可以执行)
【注意】 which/whereis查找命令所在的路径
which ls:表示查找当前位置
whereis ls :查当前位置
ls:展示当前所在的目录下的所有文件
2.3 命令格式
-
Linux命令的通用格式为:命令 [选项] [参数]
①命令: 主体功能
②选项: 用于调节命令的具体功能(具体事项)
❤以”-”引导短格式选项(单个字符),例如”-l”
❤以”- -“引导长格式选项(多个字符),例如”–color”
多个短格式选项可以写在一起,例如”-al”
③参数: 命令操作的对象,如文件、目录名等(位置)
2.3 命令帮助
- 方法一:使用help查看Bash内部命令的帮助信息
命令的”–help”选项适用于大多数外部命令
- 方法二:使用man命令阅读手册页
2.4 操作技巧
- Tab键 可以自动补全命令名称以及参数
- 命令历史 :bash中可以使用↑↓逐条翻看,允许编辑并重复执行,
- history命令 显示所有缓存在 .bash_history中的命令;
- history -c 清空历史命令
- Ctrl+a 跳转行首,Ctrl+e 跳转行尾
- Ctrl+l 清屏
- Ctrl+c 终止程序执行
- Ctrl+z 结束进程
- q: 退出
2.5 基本命令
-
重启网络服务:sudo service network-manager restart
-
查看IP地址:ip addr 或 ifconfig
-
关机: poweroff
-
重启: reroot
3. 目录结构
3.1 Linux 系统目录结构
- 目录树:
文件系统 是操作系统用于在外部存储设备(主要是硬盘)上组织文件的机制。
Linux 没有“盘符”的概念,通过一个整体的目录树来组织文件。 - 目录树(directory tree): 所有的文件与目录都是由根目录(“/”)开始,是所有目录与文件的源头, 一个一个的分支下来,我们也称这种目录配置方式为:目录树(directory tree)
1)linux的目录中有且只有一个根目录 “/”
2)linux的各个目录存放的内容是规划好的,不要乱放文件
3)linux是以文件的形式管理我们的设备,因此linux系统。一切皆文件
4)linux的各个文件目录下存放什么内容,大家必须有一个认识
5)你的脑海里应该有一颗linux的目录树
3.2 绝对路径与相对路径
- 绝对路径:从根目录开始,依次将各级子目录的名字组合起来,形成的路径就称为某个文件的绝对路径,如: /root/1.txt
- 相对路径:相对当前所在路径的位置, 依次与上下级目录文件组合,而形成的路径称为文件的相对路径,如:…/etc/passwd
. 代表当前的目录,也可以使用 . / 来表示(尽量使用 . / 表示)
. . 代表上一层目录,也可以 . . / 来代表(尽量使用 . . / 表示)
4. 常用命令
4.1 文件操作命令
-
ls——显示目录/文件
-
touch—— 创建空文件
-
mkdir —— 创建空目录
-
rmdir——删除空目录
-
rm ——删除文件或目录(Linux中删除后不可恢复,与windows系统不一样,ubuntu操作系统中没有回收站)
-
cd——切换当前目录
-
pwd——显示当前位置的绝对路径
-
wc——文件大小统计
-
cp ——拷贝文件
-
mv——修改名件名或移动文件
-
find——搜索文件
-
cat——查看文本全文内容
-
more —— 查看文本内容
-
less——
-
head——查看文件前n行
-
tail——查看文件后n行
5.vim
5.1 引入
♥ 在Windows系统中:
要想编辑(修改)文件,可以使用文本编辑器实现,例如:记事本、wps、VC或VS(c语言中源代码编辑器)…;
♥ 而在ubuntu中:也可以借助一些文本编辑器来完成对文件的修改操作,常用的编辑器有geit.exe、vi、vim等
【注意:】ubuntu是一个操作系统,该操作系统的内核是Linux;
5.2 vim的下载安装
- 下载命令:sudo apt install vim
【注意:】在用上面命令下载时,最终可能会有报错或者警告或直接显示下载不成功;此时,看可以试试:对软件包进行更新,更新之后再重新下载;
更新软件包列表命令:sudo apt update
- 更新软件包列表命令:sudo apt update
5.3 vim的使用
- 打开/创建文件: vim 文件名
功能:若文件存在,则打开文件; 若文件不存在 则创建文件并打开文件;
文件名:文件名也可以是一个具体的路径(绝对路径或相对路径) - vim/vi的三种模式: 命令模式(Command mode),输入模
式(Insert mode)和底线命令模式(Last line mode);①命令模式: 用户刚刚启动 vim,默认进入命令模式,此状态下敲击键盘动作会被vim识别为命令,而非输入字符;
♥若想进入输入模式——i或o
♥若将切换至底线命令模式则命令为——:(英文冒号)
② 输入模式:此模式下,可通过敲击键盘编辑内容至文件中;
♥esc 键退出输入模式切换至命令模式
③底线命令模式 : (常用命令)w(保存) x(保存退出) !(强制) e!(重新加载)
♥q(退出)
♥esc 切换至命令模式
【总结:】
- vim的快捷键操作 >>.>
5.4 vim的文件配置
-
可配置内容:[转载]vim配置文件【非常全面】
-
文件配置分类:
①用户文件配置 : 每个用户的家目录下面都可以创建一个.vimrc的vim配置文件优化用户编程的环境并提高开发效率。
②系统文件配置:如果想在整个环境中对vim开发环境进行优化,可将配置参数写入/etc/vimrc中。这样以后,所有用户可以使用优化后的开发环境。
二. Linux搭建c/c++开发环境
-
在VC6中 ,C语言程序开发流程:
(VC6中,系统自带开发环境,不需要用户额外自己配置)①编辑:就是创建和修改C程序的源代码-我们编写的程序称为源代码。(生成.c文件)
②编译:就是将源代码转换为机器语言。编译器的输出结果成为目标代码,存放它们的文件称为目标文件。扩展名为.o或者.obj。(该部分编译是指汇编器编译汇编语言或者编译器编译高级语言)
③链接:链接器将源代码由编译器产生的各种模块组合起来,再从C语言提供的程序库中添加必要的代码模块,将它们组成一个可执行的文件。在windows下扩展名为.exe,Unix下无扩展名。
④执行:运行程序。
【总结:】C语言源程序经过C语言编译程序编译之后,生成一个后缀为“.obj”的二进制文件(称为目标文件),最后还要由称为“连接程序”(Link)的软件,把此“.obj”文件与c语言提供的各种库函数连接在一起,生成一个后缀“.exe”的可执行文件。显然C语言不能立即执行; -
在Ubuntu(Linux为内核)中,c语言的程序开发流程:
(Ubuntu中不自带c/c++的开发环境,不能实现编译、链接、执行功能,需要用户自己安装和配置,c语言可以安装gcc;c++可以安装g++;调试可以安装gdb,gdb支持多种语言的调试,功能巨强大)
①创建和编辑源文件→生成.c文件
②编译→生成.o文件
——>release版本
——>debug版本
③链接→生成.exe文件
④执行
1. c语言开发流程
1.1 创建和编辑源文件→.c
1.2 编译
编译过程分为release模式和debug模式,debug和release版本的区别一个是编译.c的编译选项,debug使用了-g选项,release使用了-O2选项;
1. Debug 是“调试”的意思,Debug 版本就是为调试而生的,编译器在生成 Debug 版本的程序时会加入调试辅助信息(辅助信息为“-g”),并且很少会进行优化,程序还是“原汁原味”的。
2. Release 是“发行”的意思,Release 版本就是最终交给用户的程 序,编译器会使尽浑身解数对它进行优化,以提高执行效率,虽然最终的运行结果仍然是我们期望的,但底层的执行流程可能已经改变了。①编译器还会尽量降低 Release 版本的体积,把没用的数据一律剔除,包括调试信息。
②最终,Release 版本是一个小巧精悍、非常纯粹、为用户而生的程序。
1.2.1 release版本——不加 -g (不支持gdb调试)
以下操作形成的执行代码.exe不可以被调试;
1.2.2 debug版本——加 -g (支持gdb调试
以下操作形成的执行代码.exe可以被调试;
1.3 链接
1.4 执行
2. c++开发流程
3. GDB调试
3.1 启动gdb
【注意】: 若想对程序进行调试,则程序在编译时,必须加-g进行编译(即:需要在debug模式),才可以进行调试;
gdb启动命令:
启动方法一: gdb 1.exe //其中1.exe是连接以后形成的可执行文件,在编译时自己定义的名字
启动方法二: gdb -q 1.exe (不打印gdb版本信息,界面比较干净)
3.2 查看源码
- 命令:(gdb) l //查看源码
- 命令:(gdb) l 行号 //从第 “ 行号(自定义)”开始查看源程序代码,默认显示指定行的上下10行代码,源码会进行行号提示 。
- 查看在其他文件中定义的函数命令:(gdb) l 函数名或文件名 : 行号 //即可定位到这个函数的定义及查看附近该函数或该文件的源码;
例如:(gdb)l 99.c :1//查看99.c文件的源代码,从99.c源代码的第一行开始查看,查看第一行上下10行的内容
3.3 设置断点
- 命令:(gdb)b 行号 // 运行到源码第6行时停止,可以查看变量的值、堆栈情况等;这个行号是gdb的行号
例如:(gdb)b 99.c 5 //给99.c 文件中的第5行加断点
- 显示设置的所有断点:(gdb) info breakpoints 或 (gdb) info b
- 删除某个断点:(gdb) delete 断点序号
断点序号:
- 查看断点处情况:
Num: 断点编号
Disp: 断点执行一次之后是否有效 kep:有效 dis:无效
Enb: 当前断点是否有效 y:有效 n:无效
Address: 内存地址
What: 位置
3.4 运行
-
(gdb) run ( run等价缩写为 r) // 使程序运行至第一个断点处
-
(gdb) (gdb)start // 运行至main函数的初始位置
3.5 单步执行
-
(gdb) next //下一步
或 (gdb) n -
(gdb) step // 进入函数
-
(gdb) return //结束函数
-
(gdb)continue (等价缩写为 c ) //运行至下一个断点处
3.6 查看变量
-
(gdb) print var //单次打印变量,当变量发生变量时打印变量
-
(gdb) display var //每执行一步打印一次变量(每执行一句语句,即next一次,就要打印一次所查看的变量)
-
(gdb) whatis var //查看变量类型
-
(gdb) watch var //配和continue使用,只有当遇到断点时,才会显示watch 的变量var 的变化(会显示该变量的新/旧两个值)
-
(gdb) bt //显示对战信息(看哪些函数还在栈内)
3.7 结束调试
命令:(gdb) quit
3.8 gdb基本命令
4. core
- su passwd root
三.文件
1. 文件权限
1.1文件权限和标志位
1. 命令: ls -l
♥第一项表示文件对应的inode号(inode号是文件的唯一标识);
♥第二项d表示目录,l表示链接文件,-是普通文件,r,w,x分别表示可读,可写,可执行。连续三个分别表示文件所属用户具有的权限,文件所属组具有的权限,其他用户具有的权限。-表示没有权限;
♥第三项是文件的硬链接数。
♥第四,五项是文件所属用户和文件所属组。
♥第六项是文件大小,字节为单位。
♥接下来是创建时间,文件名
2. 文件权限与标志位
r:可读
w:可写,可以更改文件/目录的内容,可以删除文件/目录。
x:可执行,程序要具有可执行权限。目录必须要有可执行权限才可以进入。【注意】
代表r,w,x的十进制数字分别为:
① r :4
②w:2
③ x:1
④ -:0使用实例:
在更改/设置权限时,使用命令:chmod 755 /bin/pse
其中:7=4+2+1——可读可写可执行;5=4+1——可读可执行(不可写)…
3. 文件默认权限
普通文件(-)
目录文件(d,directory file)
符号链接(l,symbolic link)
块设备文件(b,block)和字符设备文件(c,char)
管道文件FIFO(p,pipe)
套接字(s,socket)
♥系统创建文件时是有一个默认权限的,通过使用权限掩码进行默认权限的设置。
♥使用umask命令可以查看/设置权限掩码: umask 显示权限掩码 umask 022设置权限掩码
♥系统不允许在创建一个文件时就赋予它执行权限,必须在创建后用chmod命令增加这一权限;但是目录则允许设置执行权限。
♥默认权限计算规则:用777按位减去掩码中的相应位,并且文件还要减去可执行位。
4. 更改文件权限:chmod 命令(+ - =)
使用示例:
chmod 755 /bin/pse
chmod + x bin/pse //添加可执行权限,所属用户与用户组具备执行权限
chmod-w bin/pse //去掉写权限,用户,用户组,其他用户都会去掉写权限
chmodu=rwx,g=rx,o=r bin/pse //相当于chmod 754 bin/pse
5. 更改文件所属用户与所属组: chown 命令
使用chown更改文件所属用户和用户组:
示例:
chown oklinux:oklinux hd1 //更改hd1文件所属用户为oklinux,所属用户组 为oklinux
chown :brave hd1 //更改hd1文件所属用户组
chown oklinux hd1 //更改文件所属用户 不能加:
chownoklinux:oklinux tmp/ -R //递归更改所有文件/目录的用户以及用户组
1.2软硬链接
1.2.1 引入
1. 什么是inode?
理解inode,要从文件储存 说起:
♥文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。
♥操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。“块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
♥文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点”。
2. inode号码
每个inode都有一个号码,操作系统用inode号码来识别不同的文件。
【注意】 Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。
♥表面上,用户通过文件名,打开文件。
♥实际上,系统内部这个过程分成三步:首先, 系统找到这个文件名对应的inode号码;其次 ,通过inode号码,获取inode信息;最后 ,根据inode信息,找到文件数据所在的block,读出数据。
♥ 可以通过stat 命令 来查看文件的iNode 号,例如:stat 1.c
1.2.2 硬连接
-
硬链接的概念:
♥指通过inode来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为inode号码。在Linux中,多个文件名指向同一inode号码是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户 就可以建立硬连接到重要文件,以防止“误删”的功能。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。
♥其原因如上所述,因为对应该目录的inode号码有一个以上的连接。只删除一个连接并不影响索引节点本身和 其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。 -
硬链接的特点:
① 硬链接,以文件副本的形式存在,但不占用实际空间。硬链接并没有建立新文件,相当于文件有一个别名;可以理解为C++中的引用(不占用内存,只是给某个内存空间的别名,修改时会影响主空间的值)
②不允许给目录创建硬链接。
③硬链接只有在同一个文件系统中才能创建。
④Unix/Linux系统允许,多个文件名指向同一个inode号码。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响其他有相同 inode 号的文件;
⑤在执行连接之前,存放连接的目录中不能有与链接名同名的文件。如果创建硬连接,则源文件必须存在,并且不能是目录;
⑥inode 号仅在各文件系统下是唯一的,当 Linux 挂载多个文件系统后将出现 inode号重复的现象。所以创建硬链接不能跨文件系统也不能跨分区; -
创建硬链接
命令: ln 源文件 目标文件【注意】 运行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做"链接数",记录指向该inode的文件名总数,这时就会增加1。反过来,删除一个文件名,就会使得inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。
【目录文件的"链接数"】 创建目录时,默认会生成两个目项:“.“和”. .”,前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。所以,任何一个目录的 "硬链接"总数 ,总是等于2加上它的子目录总数(含隐藏目录),这里的2是父目录对其的“硬链接”和当前目录下的".硬链接“。
1.2.3 软链接
-
软链接的概念
文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会通过A文件中的地址自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)
类同与windos的快捷方式,给文件创建一个快速的访问路径,它依赖于原文件,与普通文件没什么不同,inode 都指向同一个文件在硬盘中的区块。当原文件出现问题后,该链接不可用。
-
软连接的特点:
(1)可以应用于目录
(2)可以跨文件系统
(3)不会增加被链接文件的链接次数
(4)大小为指定的绝对路径所包含的字符总数
(5)有自己的inode号
(6)权限无关紧要 -
创建软连接:
命令:ln -s 源文文件或目录 目标文件或目录
【注意:】
①示例:ln -s/bin/date $HOME/bin/t。在主目录下的bin目录创建符 号链接t指向/bin/date。
②目标文件或目录最好用绝对路径;
③创建符号链接就会创建一个文件,此文件记录的是另一个文件的路径。删除源文件或目录,只删除了数据,不会删除软链接。一旦以同样文件名创建了源文件,连接将继续指向该文件;
④符号链接的大小是其指向文件名称的字节数
⑤符号链接可以跨分区跨文件系统,在实际使用中,符号链接很普遍
1.3 系统tar文件压缩打包命令
1.3.1 tar.gz格式
打包成tar.gz格式压缩包 tar -zcvf 目标文件 源文件
解压tar.gz格式压缩包 tar -zxvf xx.tar.gz -C 目标路径
1.3.2 tar.bz2格式
打包成tar.bz2格式压缩包 tar -jcvf 目标文件 源文件
解压tar.bz2格式的压缩 tar -jxvf xx.tar.gz 目标路径
1.3.3 zip格式
压缩成zip格式 zip -q -r 目标文件 源文件
解压zip格式的压缩包 unzip xx.zip
四. 用户和组
1. 用户
-
Linux中的用户分三类:超级用户root、普通用户、系统用户
①普通用户: 系统安装时创建的用户及后期使用中由用户创建的用户
②系统用户: 系统及服务运行时必须存在的用户,但与真是的普通用户有所不同,默认情况下是不能登陆系统的,他们的存在主要是满足系统进程对文件属主的需求。
③root用户: root用户具有最高权限,它的UID是0。在Centos上以root用户登陆时提示符会变成#,其他用户提示符是$;经常有人把root和Windows下的administrator做对比,表面上看二者都是系统最高级别管理员,但是它们其实是有区别的。Windows下有SYSTEM用户,SYSTEM才是最高权限用户,但仅限系统自己使用,administrator的权限也 没
有SYSTEM的权限大。而Linux下的root用户可以做一切事情,甚至可以直接毁掉整个系统。 -
用户信息文件
①用户密码信息文件shadow : /etc/shadow文件保存的是用户密码加密后的数据,每一行对应一个用户的密码记录,每个用户对应/etc/passwd 中的用户,只有root权限才可以读取;
②用户信息文件passwd: 保存在/etc/passwd文件中,每一行对应一个用户的账号记录,可以使用 cat /etc/passwd 命令查看其中保存的信息;文件中每行的格式为:登录名:口令:用户标识号:组标识号:注释性描述:主目录:登陆后启动的SHELL
2.组
对组的分类:
分类方法一:超级用户组(rootgroup)、系统组(system group)和用户组(usergroup)。超级用户组是超级用户所属的组,系统组是系统用户所属的组,用户组是普通用户所属的组;
分类方法二:基本组 和 附加组 。用户所属组中的第一个组成为基本组,基本组在 /etc/passwd 文件中指定;用户所在的其他组为附加组,附加组在 /etc/group 文件中指定。不可以把用户从基本组中删除,但是可以从附加组中删除。一个用户可以属于多个附加组,但是一个用户只能有一个基本组;
分类方法三:私有组 和公共组 。建立账户时,若没有指定账户所属的组,系统会建立一个和用户名相同的组,这个组就是私有组,这个组只容纳了一个用户。而公共组可以容纳多个用户属于多个组的用户所拥有的权限是它所在的组的权限之和;
3. 基本操作
3.1 对用户的操作
1.增加用户 (sudo) useradd -r -m -s /bin/bash [username]
2.查看所有用户 cat /etc/passwd
3.设置用户密码 (sudo) passwd [username]
4.删除用户 (sudo) userdel -r [username]
5. 用户切换 su [选项] [用户名]
su:
【switch user切换用户】: 可让一个普通用户切换为超级用户或其他用户,并可临时拥有所切换用户的权限,切换时需输入要切换用户的密码;也可以让超级用户切换为普通用户,临时以低权限身份处理事务,切换时无需输入密码
【用法】:su[选项][用户名]。后边不带 username使用时,su默认会切换到超级用户-, -l, --login选项可以切换到其他用户、示例:su – oklinux
【注意】su root和su一样,切换后以root身份执行命令,但当前工作目录不变
sudo:
♥sudo允许程序临时以root身份运行。sudo默认是以root身份运行命令,但是使用-u [username]可以以其他用户身份运行命令;
♥sudo是受限制的su,它通过一个配置文件,授权某些用户可以临时具有root用户才有的权限(5分钟);
♥sudo读取 /etc/sudoers 文件的信息以判断当前用户是否有权限运行sudo。运行sudo输入的是当前用户的密码,这样使用授权的方式杜绝了root密码的泄露,同时可以根据需要进行用户授权。
♥如果是root用户,不需要使用sudo
♥示例(获取软件更新):sudo apt update
3.2 对用户组的操作
1.新建工作组 groupadd [groupname]
2.将用户添加进工作组 usermod -G [groupname] [username]
3.查看用户组 cat /etc/group
4.
五. IO定向与管道
1. 标准输入和输出
1.1 引入
-
IO:
♥ IO的I是Input的意思,O是output的意思。意味着输入和输出。
♥ 更确切的含义是:
I:从外部设备输入到内存
O:从内存输出到外部设备 -
标准输入和输出注意点:
①标准输入和标准输出的作用:用于IO的
②标准输入和标准输出属于IO的哪个部分:外部设备(逻辑上的外部设备)
③在linux操作系统中,外部设备用什么表示:是用文件(linux中一切设备皆是文件!因此标准输入和输出更具体的含义是文件。);
④准输入和标准输出是哪两个文件:它们是/dev/stdin这个文件 和/dev/stdout这个文件(标准输入和标准输出其实就是两个linux下的文件);
⑥在Linux中一切皆文件,所以标准输入、标准输出、标准错误都有对应的文件,而这种对应关系是通过文件描述来实现的,我们在重定向的时候还会用到它们; -
linux的文件类型有:
①普通文件
②字符设备文件
③块设备文
④目录文件
⑤链接文件
⑥管道文件
⑦套接字文件 -
标准输入读 & 输出到标准输出:
标准输入读 :逻辑上来看,就是打开/dev/stdin这个文件,然后把这个文件里的内容读进来;
输出到标准输出 :逻辑上来看,就是打开/dev/stdout这个文件,然后把内容输出到这个文件里去;
1.2 输入输出概述
1.进程和信道
- 每个进程都至少有3个信道:标准输入–stdin、标准输出–stdout、标准错误–stderr
标准输入:文件描述符为0,默认指向终端(在虚拟终端中即为键盘)
标准输出:文件描述符为1,默认指向终端(在虚拟终端中即为屏幕)
标准错误:文件描述符为2,默认指向终端(在虚拟终端中即为屏幕)
- 对于一个进程来说,它从描述符0(0<)指向的文件读取输入信息,把执行结果送到描述符1(1>)指向的文件,把出错信息送到描述符2(2>)指向的文件,而不关心这些文件具体是什么;
- 关于文件描述符:一个进程有一个结构保存一组打开的文件,每个打开的文件用一个数字标识,此数字一般被称为文件描述符,而在Linux/Unix上设备也被映射为文件,数字0,1,2都会分别关联到键盘,屏幕,屏幕;
2.IO重定向
- 引入: 在shell中输入命令运行程序,程序的正常输出信息(标准输出)和一些出错信息(标准错误)会通过shell显示在屏幕上。有时候我们并不需要把这些输出信息(包括标准输出和标准错误)显示在屏幕上,或需要把这些输出信息保存在一个文件中,这时就需要进行输出重定向。如果一个命令要获取的输入来自文件,或者是在shell脚本编程中,需要从文件获取输入,则需要进行输入重定向;
重定向示例:
echo ‘abc’ ——会输出abc到屏幕。
echo ‘abc’ >tmp/buff ——会把abc输出到tmp/buff这个文件。如果没有此文件则会创建这个文件并写入。但是如果文件存在并且不为空,则重定向会导致之前的数据丢失,只保存重定向的数据。
echo ‘abc’ >> /tmp/buff ——会把abc追加到文件末尾,之前的数据不会丢失.
例1.
例2:
注解:main为vim 1.c函数中的一个求和函数编译执行之后形成的可执行文件;
- 重定向符号
例如:编写一个c语言函数,编译、链接、执行之后形成可执行main文件(绿色);
①将输入设置为从1.txt文件中获取;
将输出设置为写入2.txt中;
将报错信息设置为写入3.xt中;
②显示输出和报错
3. 管道
- 管道:把一条命令的stdout连接到另一条命令的stdin上,可以用 | 这个符号,在shell中表示管道。
- 原理: shell在解释命令遇到 | 时会创建管道,并创建两个进程,把标准输入输出重定向到管道,前一个进程向管道写数据,后一个进程从管道读数据。在管道中只有标准输出才传递给下一个命令,标准错误输出直接输出到终端。
六. 进程管理
1. 进程基本介绍
- 进程: 运行中的程序就是进程。系统会给每一个进程分配一个数字进行标记,称为进程ID(PID)。
- 父进程:如果进程B由进程A来创建,则进程A就是进程B的父进程,进程B就是进程A的子进程。
- PPID:父进程的进程ID。
- 在shell中输入命令运行,则shell就是父进程,运行的程序就是shell的子进程。(守护进程除外,守护进程的父进程是init[进程ID为1])。
2. 各类id
- UID( user id ):所属用户ID,每一个进程都有一个所属用户ID,就是运行程序的用户的 ID。每一个进程都有一个父进程,通常情况下子进程的UID继承自父进程。 但是系统通过系统调用传递参数更改进程的UID以标识进程的创建者。
- EUID(effective userid):有效用户ID,表示进程对于文件和资源的访问权限。大多数情况下EUID和UID是相同的。对于设置了相关标志位的程序,运行时会改变EUID,系统根据EUID赋予进程相应的权限。
- GID(group id):进程的组ID,程序所属组的ID,参考UID解释。
- EGID(effectivegroup id):有效组ID,参考EUID解释。
3.进程管理相关命令
- ps
①ps //查看当前进程信息
②ps -ef //查看所有进程的信息
③ps -ef | grep xx // 查看xx命令进程的信息
④ps -aux //显示Linux系统中正在运行的全部进程top //查看PRI和NI
- kill : 终止进程
kill 1234 //向PID为1234的进程发送终止信号。默认的信号是SIGTERM,此信号通常会终止程序的运行,但程序可能仍然 继续运行。这个时候可以向进程传递SIGKILL信号,会强制进程结束。
kill -9 1234 //向PID为1234的进程发送kill信号。♥-9: 有些进程使用kill命名无法结束,需要加-9;
♥SIGINT: 使用ctrl+c终止程序运行时发送的就是SIGINT信号,SIGINT、SIGTERM可以被程序捕获并进行自定义处理,而SIGKILL不能被捕获。
例如:
3. & Ctrl+Z jobs bg fg
[注意:] 在命令后面加入&便可以直接使任务直接在后台运行。
>一个任务如果运行时间太长,或者是需要长期运行的情况,此时想要获取终 端控制权。可以把任务转至后台。
♥在命令后面加入&便可以直接使任务直接在后台运行。
♥在运行中输入Ctrl+Z会把当前任务转至后台暂停;
♥此时使用jobs可以显示 后台的任务,每个任务都有一个编号,可以查看后台命令编号;
♥bg [ 后台任务编号 ]可以使任务在 后台继续执行;
♥fg [ 后台任务编号 ]把后台的任务转至前台执行
4. top/htop-动态监控进程以及资源占用
top命令用于实时显示 process 的动态。
可以看到总体的系统运行状态和cpu的使用率 。%us:表示用户空间程序的cpu使用率(没有通过nice调度)
%sy:表示系统空间的cpu使用率,主要是内核程序。
%ni:表示用户空间且通过nice调度过的程序的cpu使用率。
%id:空闲cpu
%wa:cpu运行时在等待io的时间
%hi:cpu处理硬中断的数量
%si:cpu处理软中断的数量
%st:被虚拟机偷走的cpu
top:(系统自带)
htop:(需要自行下载)
2.4 进程优先级
- 运行nice会显示当前shell的优先级。一般情况下,子进程会继承父进程的优先级。系统内核在进程运行时也会动态调整。
- nice ps 会在当前优先级加上一个数值(默认是10)运行ps。nice调整数字 的范围是-20~ 19。数字越小优先级越高。
- renice [VALUE] [PID] 调整进程优先级,[VALUE] 是一个整数,如果是负数 则只有root权限才可以执行。
- 通过ps -l查询发现有一个PRI项,PRI是系统内核动态调整的优先级参数,实际 的运行优先级是PRI+NI。
①ps //查看当前进程信息
②ps -ef //查看所有进程的信息
③ps -ef | grep xx // 查看xx命令进程的信息top //查看PRI和NI
2.5 网络常用命令
2.6 du df
七.shell脚本
1. 概念区分
1.1 什么是shell?
shell是用户和系统交互的桥梁;
shell是Linux的一个程序,实现版本有多种。
shell的主要工作就是运行命令。
sh是shell的简写,shell的实现版本有:sh,bash,csh,tcsh,zsh(解释器)。
多数Linux默认的shell是bash。
Linux启动登录以后,会运行一个shell等待用户输入命令。
用户通过shell和系统交互。
1.2 什么是shell脚本?
-
shell可以从一个文件读取命令并逐条执行。文件一般被称为脚本。
-
大多数Linux发行版的默认shell都是bash。
-
文件第一行使用#!/bin/bash表明这是一个bash脚本,注意有些脚本程序使用 #!/bin/sh表示。
-
在Ubuntu/Debian上,sh是一个符号链接指向dash,dash是一个专为执行脚本而设计的shell程序,执行速度快,语法遵循POSIX标准,但是功能比bash 少很多。
-
一个简单的脚本:开头声明这是一个bash脚本,然后是主要操作代码,最后 以exit 0退出。
-
脚本编辑完成后默认无执行权限, 需手动赋予权限(chmod)
2. 环境变量
2.1 基本概念
♥环境变量: 是一个名称和值的对应列表。一种是shell启动时解析配置文件生成,还有一种临时的环境变量是在shell中使用export生成。
♥当前shell运行时保存的信息,包括终端类型、当前目录、主目录、语言编码、默认命令搜索路径等信息。
♥运行env命令可以查看当前环境变量。
♥PATH变量: 记录了要查找命令的路径顺序;
♥HOME记录当前用户主目录;
♥PWD是当前工作目录,每次切换目录都会变化。
♥使用 $ 取值:echo $PWD,而echo PWD仅仅是输出PWD字符串
2.2 配置环境变量
2.2.1 为什么要配置环境变量?
引入:
- 假设我们在某个0519这个目录中写了一个函数1.c(九九乘法表的打印函数),编译链接之后生成一个可执行文件main,该可执行文件是在:/home/test/0519/路径下面;
- 如果此时,我想执行该函数,那么我必须要进入0519目录下,然后执行该文件下的main可执行文件;或者直接使用绝对路径/home/test/0519/main来实现;例如:
- 现在,我觉得每次要执行该文件的过程太繁杂,想要把该九九乘法表函数设置成命令,即在任何地方只要敲:main,就可以执行该函数(九九乘法表);例如:
- 那么,如何才能实现这种功能呢?答:配置环境变量。
2.2.2 配置环境变量具体步骤
2.3 shell运行命令的过程
-
输入一条命令并确认后,实际shell获取的是一行字符串,shell要对字符串进行解析,并确定命令名称,参数等信息。shell支持从文件读取文本逐 条解释执行。
-
然后,shell要根据配置文件的搜索路径PATH,从每个路径寻找命令,没有找到则提示错误信息,找到就调用Linux提供的系统调用运行命令。
示例注解:
上文中配置完环境变量之后,可执行文件main变成main命令,原理: 如果输入main,则shell获取字符串“main”并确认其信息,然后shell会根据.profile(用户端)配置文件去搜索main的路径/home/test/0519/,然后找到可执行文件main并运行;比如:输入 ls -l,shell要解析成‘ls’ ,‘-l’,’ls’就是命令名称,并在PATH设置的路径中寻找,找到/bin/ls这个命令,fork一个子进程调用 exec等系统调用传递参数运行命令。并等待结束。
-
注意:真正运行命令的不是shell,而是内核,shell去调用内核提供的接口,shell是调用fork创建子进程去运行命令。
2.4 通配符
-
shell支持通配符,使用*表示匹配任意长度的字符,?表示匹配任意一个字符。
shell在遇到通配符会进行扩展,比如输入ls ./a*,会匹配a开头的所有文件并显示,如果存在ab.txt,ac.txt,则会扩成ls ./ab.txt ./ac.txt。
-
注意:扩展通配符的是shell,不是命令自身,如果是命令本身实现的,那就每个命令都要实现。
3.通配符在使用时会带来很多便利,但是有些特殊情况也要注意。
任务:
整理所有通配符及含义
2.5 变量
2.5.1 变量的基本概念及引用格式
- 定义变量:shell运行A=123就定义了A变量。
- 变量的作用:shell中的变量就是为某些需要保存的数据用一个名称标记,方便以后使用。
- 变量的名称:以字母或是下划线符号开头,后可跟任意长度的字母、数字、下划线。
♥=左右不能有空格,否则会按照运行命令的方式去执行。
♥a=ls
会把ls运行的结果赋值给a。注意是反单引号。
♥获取变量的值要用$,echo $A可以输出变量的值 或echo ${A}。
♥shell中的变量就是键值对(key-value)的列表,都是以文本的形式存储的。a=1+2不会进行计算把3赋值给a,而是a的值就是‘1+2’这段文本。变量的值可以用双引号/单引号括起来,包含空格的变量就必须要这么做。
2.5.2 变量基本操作
- 查看:
①用set 命令可以查看所有的变量。
②可以使用set | grep linux 进行搜索 - 清除:
unset var 命令可以清除变量var,相当于没有定义过。使用空格分隔多个变量。 - 修改变量值: 变量设置后,是可以修改值的:a=12; a=13,此时a的值就是13;
- 修改变量权限:readonly 把变量设置为只读:readonly a
【注意】但是变量设置为只读权限之后,只读变量就无法更改和清除。除非重置shell环境。
- 特殊变量操作
2.5.3 对变量的输入和输出(I/O)
-
读取用户输入: read var // (用户在命令框通过输入对var赋值,可不定义变量,输入即定义,默认按行读取)
-
输出至终端: echo …
①单独一个echo表示一个换行
②使用echo输出时,每一条命令之后,都默认加一个换行
③要想取消默认的换行,需要加 -n 参数,例如:echo -n
2.5.4 变量的基本运算
- 算数运算符:
- 计算命令:
实例:
2.5.5 shell test 命令(变量表达式)
2.6 数组
- 数组基本概念:
♥数组中可以存放多个值。
♥Bash Shell 只支持一维数组(不支持多维数组);
♥初始化时不需要定义数组大小(与 PHP 类似)。
♥与大部分编程语言类似,数组元素的下标由 0 开始。
♥shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:arr=(value1 value2 … valuen)
-
数组的基本命令:
读取数组元素 ${array[index]}
获取数组中的所有元素 ${array[@]}
获取数组的长度 ${#array[@]}
3. 语句
3.1 if
3.2 case
3.3 for
3.4 while
3.5 until(与while相反)
4. shell函数
- 说明:linux shell 可以用户定义函数,可在shell脚本中可以调用。
- 函数格式:
①可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
②参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
③在shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式获取参数的值,当n>=10时,需要使用${n}来获取参数。
- 参数说明:
5. shell外部脚本
5.1 fork
5.2 exce
5.3 source
6. cronrab 定时任务
八. 三剑客
1. grep(文本查找工具)
- 作用:grep 命令用于查找文件里符合条件的字符串。
用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。
- 打印内容:默认打印搜到到关键字的整行
- 常用选项:
-v 反向查找
-r 递归查找
2. awk(文本分析工具)
2.1 基本命名格式
-
作用:awk是Unix环境下一种非常好的语言,适合于文本处理和报表生成,它还有许多精心设计的特性,允许进行特殊技巧程序设计。对于短消息来说,比如处理话单文件,使用awk就非常方便。
-
awk的核心:格式化
awk ‘{print}’ hello.txt 输出文件内容
-
常用变量
$number 表示记录的字段。比如,$1表示第1个字段,$2表示第2个字段,而$0代表全部字段
FS 表示字段分隔符
NF 表示当前记录中的字段数量,NF>1表示拿到第一行的以下内容
NR 表示当前记录的编号(awk将第一个记录算作记录号1)awk -F"," ‘{ print $3,$4 }’ 文件路径 //以逗号当分隔符按行拆分文件 输出第三第四个字段
awk -F"," ‘{ print "hello: "$3, "\tworld: "$4 }’ 文件路径 //将双引号中的普通字符插入至查询结果
2.2 BEGIN和END
- 在Unix awk中两个特别的表达式:BEGIN和END
这两者都可用于pattern中(参考前面的awk语法),提供BEGIN和END的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作; - 整体可分为三个部分:
’BEGIN{} {} END{}’
任何在BEGIN之后列出的操作(在{}内)将在Unix awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果.,中间的{}表示循环体
应用:
在2.txt中写入一些学生信息,在8.sh脚本中计算2.txt中所有学生的年龄
3. sed(文本处理工具)
3.1 sed 基本概念
- 作用:sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。
- sed的核心:正则
3.2 sed 基本命
-
命令格式:sed [选项] 文件路径
-i 直接编辑文件 (如果不加 i 选项不添加,表示只打印修改后内容 ,不修改原文本)
-n 表示保留指文件的指定行
-d 表示删除指定文件的指定行
-s 表示替换
-a和i在插入中分别表示:在某行之前/之后插入 -
保留指定行
-
删除指定行
-
替换内容
-
插入内容
九 .服务
1. ssh协议(安全外壳协议)
1.1 引入(什么是ssh协议?)
-
SSH 为Secure Shell的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UX、Linux、AIX、Solaris、DigitalUNIX、Irix,以及其他平台,都可运行SSH.
-
ssh功能
传统的网络服务程序,如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的, 就是很容易受到“中间人”(man-in-the-middle)这种方式的攻击。所谓“中间人”的攻击方式, 就是“中间人”冒充真正的服务器接收你传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被“中间人”一转手做了手脚之后,就会出现很严重的问题。通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。使用SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、PoP、甚至为PPP提供一个安全的"通道"
-
验证
从客户端来看,SSH提供两种级别的安全验证:
(1)第一种级别(基于口令的安全验证)只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。
(2) 第二种级别(基于密匙的安全验证)
需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。
1.2 ssh 传输文件步骤(Linux用户和linux用户之间传输文件)
-
获取对方的Linux系统段端的IP地址和用户密码;
-
文件传输:
(1)从本地复制到远程(对方)命令:scp 本地路径 远地用户名@远地IP:远地文件/目录路径
♥接收到其他Linux用户的文件:
(2)从远程(对方)复制到本地
命令:scp 远地用户名@远地IP:远地文件/目录路径 本地路径
2. FTP协议(文件传输协议)
2.1 引入(什么是ftp协议?)
- FTP是ARPANet的标准文件传输协议,该网络就是现今Internet的前身。
文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议, 它工作在 OSI 模型的第七层, TCP 模型的第四层, 即应用层, 使用 TCP 传输而不是 UDP, 客户在和服务器建立连接前要经过一个“三次握手”的过程, 保证客户与服务器之间的连接是可靠的, 而且是面向连接, 为数据传输提供可靠保证。
FTP允许用户以文件操作的方式(如文件的增、删、改、查、传送等)与另一主机相互通信。然而, 用户并不真正登录到自己想要存取的计算机上面而成为完全用户, 可用FTP程序访问远程资源, 实现用户往返传输文件、目录管理以及访问电子邮件等等, 即使双方计算机可能配有不同的操作系统和文件存储方式同大多数Internet服务一样,FTP也是一个客户/服务器系统。
用户通过一个客户机程序连接至在远程计算机上运行的服务器程序。依照FTP协议提供服务,进行文件传送的计算机就是FTP服务器,而连接FTP服务器,遵循FTP协议与服务器传送文件的电脑就是FTP客户端。用户要连上FTP服务器,就要用到FTP的客户端软件,通常Windows自带“ftp”命令,这是一个命令行的FTP客户程序;
- ftp服务器搭建
(1)安装ftp服务
(2)使用iptables配置防火墙规则
(3)创建用户
(4)修改或添加用户密码
(5)配置ftp的配置文件
(6)启动服务
详细步骤:https://blog.csdn.net/qq_36980029/article/details/108541953
-
客户端连接 FTP 服务器
步骤 1: 建立 FTP 连接 ftp IP(此处IP为服务器端的ip,可通过ip addr 命令查询)
①先ping通对方的ip
②fip ip
步骤 2: 使用用户名密码登录 (输入服务器设置的用户名与密码)
步骤 3: 目录操作 ls cd mkdir…
步骤 4: 使用 FTP 下载文件 bin(开启二进制传输) get 文件路径
步骤 5: 使用 FTP 上传文件 put 文件路径
步骤 6: 关闭 FTP 连接 bye 或exit或 quit…
提示:ftp 有选项-in 可关闭交互模式 自动化上传下载
3. samba
3.1 引入
-
Samba是SMB的一种实现方法,主要用来实现Linux系统的文件和打印服务。
①Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。
②SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。 -
功能: Samba最大的功能可用于Linux与windows系统直接的文件共享和打印共享,
Samba既可用于windows与Linux之间的文件共享,也可用于Linux与Linux之间的资源共享,由于NFS的出现,因而 Samba更多用在Linux与windows之间的数据共享上面。Linux用户通过配置使用Samba服务器可以实现与Windows用户的资源共享。守护进程smbd和nmbd是Samba的核心,在全部时间内运行。nmbd程序使得通过企图计算机可以浏览Linux服务器。
Samba服务器可实现如下功能:
♥WINS和DNS服务;
♥网络浏览服务;
♥Linux和Windows域之间的认证和授权;
♥UNICODE字符集和域名映射;
♥满足CIFS协议的UNIX共享等。
3.2 samba下载和配置环境变量
-
sudo apt install samba #下载
-
cd /etc/samba/ #切换目录
-
cp smb.conf smb.conf-bak #文件备份
-
sudo vim smb.conf #此user必须为存在用户
-
smbpasswd -a super #添加用户、设置密码
-
sudo mkdir 路径 # 新建目录,用于共享
-
sudo chown nobody:nogroup 路径 # 更改权限信息
-
sudo chmod 777 路径 # 给所有用户添加读写权限
-
sudo service smbd restart # 重启服务
3.3 samba应用实例
- 目的:完成Windows和linux文件共享
①在linux中将project目录设置为共享文件夹(目录)
②在windows下访问project目录,并在该目录下写c++代码(包括源代码文件、头文件、成员函数文件);
③在linux下使用g++编译、链接、执行该工程,分别生成.o 、.exe文件; - 具体步骤:
4. make
4.1 引入
- 在shell中,从编辑源文件(c语言.c或者c++.cpp)→编译→链接→执行,
①创建和编辑源文件→c语言源文件生成.c文件,c++生成.cpp文件
②编译→生成.o文件
③链接→生成.exe文件
④执行
【缺点】:当项目较大,源文件较多时,编译和运行比较耗时; - make
在默认的方式下,也就是我们只输入make命令。那么,make会在当前目录下找名字叫“Makefile”或“makefile”的文件。①如果找到,它会找文件中的第一个目标文件 target 他会找到 prerequisites 这个文件,并把这个文件作为最终的目标文件。
② 如果prerequisites文件不存在,或是prerequisites所依赖的后面的 .o 文件的文件修改时间要比prerequisites 这个文件新,那么,他就会执行后面所定义的命令来生成prerequisites这个文件。
③ 如果prerequisites 所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件声明make的终极任务,也就是执行文件target 了。
4.2 make
- make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。
1.如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2.如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3.如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
【总结:】 仅仅编译修改过的文件并全部链接,对于没有改变过的文件不用二次编译(不做无用功——提升效率)
4.3 makefile
- make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。
- 一个工程中的源文件不计数,其按类型、功能、模块分别放在干个目录中makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令。
- Makefile中的五个重要内容:
显式规则: 显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成
的文件,文件的依赖文件,生成的命令。
隐晦规则: 由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefi
le,这是由make所支持的。
变量的定义: 在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点你C语言中的宏,当
Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。
文件指示: 其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样注释:Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C++中的“//”
一样。如果你要在你的Makefile中使用“#”字符,可以用反斜框进行转义,如:“#”。
4.4 makefile实例
-
分别编辑vim:两个类(2个.h头文件和2个.cpp文件)
-
编辑一个主函数文件:intmain.cpp文件
-
编译、链接、执行;
-
创建并编辑makefile文件
-
用make命令来完成几个函数的编译、链接、执行
【makefile文件优化】