命令解析器:交互地解释、执行用户输入的命令,将用户的操作翻译成机器可以识别的语言,完成相应的功能。
用户使用文字操作操作系统—>使用者界面(shell,KDE,application)接受来自用户的命令与内核进行沟通—>内核(控制硬件工作,进程管理等)—>与硬件进行交互。
默认解析器为bash,用户输入所有命令通过bash进行解析,然后执行。
补齐命令
补齐路径
显示当前目录下的所有目录
快捷键: ctrl + L
ctrl + c 结束进程
ctrl + z 中断进程,此时进程是挂起状态,可以用fg重启前台被中断的进程。
从当前位置向上遍历:ctrl + p 或(⬆)
从当前位置向下遍历:ctrl + n 或(⬇)
移动到头部:ctrl + a
移动到尾部:ctrl + e
删除光标前面的字符:Backspace
删除光标后面的字符:ctrl + d
删除光标前面的所有字符:ctrl + u
删除光标后面的所有字符:ctrl + k
快捷键:Ctrl + Alt + T
新建一个终端:ctrl + shift + n
在终端里新建一个标签:Ctrl + shift + T
关闭标签页:Ctrl + d
标签页切换:alt + 1-9
放大终端字体:ctrl + shift + =
缩小终端字体:ctrl + -
全屏:F11
内建命令:bash中集成的命令。
外部命令:安装外部软件所带的命令。
内建命令比外部命令有更高的执行效率。外部命令执行往往需要fork一个子进程。
command [-options] [parameter1] …
说明:
command:命令名
[-options]:选项,对命令进行控制,可以省略
[parameter1] …:传递给命令的参数,可以是零个或多个
一般格式:
- + 字母 例如[ -r -p -l]
或者-- + 单词 例如[ --help ]
终端输入:man man查看手册所有内容
功能键:
b 回滚一屏
f 前滚一屏
用法:
查看第几章的什么命令:
man -k passwd 搜索关键词passwd
man -f passwd 等价于what is passwd
绝对路径:以"/"开头,“/
”代表根目录。
相对路径:指目标目录相对于当前目录的位置。
特殊目录:
. 代表当前目录, ..
代表上一级目录
打印当前工作目录的名字。绝对路径。
cd 切换到当前用户的home目录
cd . 当前目录
cd . . 上一级目录
cd - 进入上一个进入的目录
mkdir -p 创建递归目录
rmdir 用法和mkdir一样,支持相对路径和绝对路径。
Linux对数据文件(.mp3 .jpg)、程序文件(.c .h),设备文件(鼠标、键盘),网络文件(socket)等都抽象为文件,使用统一的方式管理。
颜色 | 文件类型 |
---|---|
白色 | 普通文件 |
绿色 | 可执行文件 |
红色 | 压缩文件 |
蓝色 | 目录文件 |
青色 | 链接文件 |
黄色 | 设备文件 |
灰色 | 其他文件 |
普通文件是计算机操作系统用于存放数据、程序等信息的文件,一般都长期存放于外存储器(磁盘、磁带等)中。普通文件一般包括文本文件、数据文件、可执行的二进制程序文件等。
在Unix/Linux中可以通过file命令来查看文件的类型。如果file文件后面携带文件名,则查看指定文件的类型,如果携带通配符“*”,则可以查看当前目录下的所有文件的类型。
普通文件 以-开头
Unix/Linux系统把目录看成是一种特殊的文件,利用它构成文件系统的树型结构。
目录文件只允许系统管理员对其进行修改,用户进程可以读取目录文件,但不能对它们进行修改。
每个目录文件至少包括两个条目,“…”表示上一级目录,“.”表示该目录本身。
目录文件 以d开头
Unix/Linux系统把每个设备都映射成一个文件,这就是设备文件。它是用于向I/O设备提供连接的一种文件,分为字符设备和块设备文件。
字符设备的存取以一个字符为单位,块设备的存取以字符块为单位。每一种I/O设备对应一个设备文件,存放在/dev目录中,如行式打印机对应/dev/lp,第一个软盘驱动器对应/dev/fd0。
字符设备 以c开头
块设备 以b开头
管道文件也是Unix/Linux中较特殊的文件类型,这类文件多用于进程间的通信。
管道文件 以p开头
类似于 windows 下的快捷方式,链接又可以分为软链接(符号链接)和硬链接。
ls常用参数:
-a 显示指定目录下所有子目录与文件,包括隐藏文件。
-l 以列表方式显示文件的详细信息。
-h 配合-l以人性化方式显示文件大小。
列出的信息说明:
文件类型 所有者权限 组权限 其他用户权限 硬链接数 所有者 所属的组 大小 文件最后的修改时间
通配符 | 含义 |
---|---|
* | 代表文件名中所有字符 |
ls te* | 查找以te开头的所有文件 |
ls *html | 删除以html结尾的所有文件 |
? | 代表文件名中任意一个字符 |
ls ?.c | 查找 第一个字符随意,后缀名为c的文件 |
[ ] | 将字符括起来,表示可以匹配[ ]中的任意一个字符 |
[abc] | 匹配abc中的任何一个 |
[a-z] | 匹配a到z中的任何一个 |
[^a-z] | 不匹配小写字母 |
如果文件不存在,创建新文件。
如果文件存在,更新文件时间。
不能用于文件夹。
将给定的文件或目录复制到另一个文件或目录中。
选项 | 含义 |
---|---|
-a | 该选项通常在复制目录时使用,它保留链接、文件属性,并递归地复制目录,简单而言,保持文件原有属性。 |
-f | 覆盖已经存在的目标文件而不提示,默认覆盖不提示 |
-i | 交互式复制,在覆盖目标文件前给出提示要求用户选择 |
-r | 若给出的源文件是目录文件,将递归复制该目录下所有文件到另一个目录 |
-rf | 强制复制文件夹,不提示 |
可以通过rm删除文件或目录。
选项 | 含义 |
---|---|
-i | 交互式删除 |
-f | 强制删除,无提示 |
-r | 递归删除目录下的所有内容 |
用户可以使用mv来移动文件或目录。
cat将文件内容一次性输出到终端。
-n 给输出的所有行编号。
less命令将文件内容分页显示到终端,可以自由上下浏览。
命令 | 作用 |
---|---|
回车 | 显示下一行 |
PageDown | 显示下一页 |
ctrl + p | 显示上一行 |
PageUp | 显示上一页 |
q | 退出 |
head命令从文件头部开始查看前n行的内容。
tail命令从文件尾部向上查看最后n行的内容
du查看某个目录的大小
-sh 以K M G为单位,显示指定文件或目录占用的数据块.
df用于检测文件系统的磁盘空间占用和空余情况,可以显示所有文件系统对节点和磁盘块的使用情况。
按文件名查询:- name
find 路径 -name “文件名”
按大小查询:- size
find 路径 -size 范围
直接查询
+是大于 , -是小于。
Linux系统中grep命令是一种强大的文本搜索工具,grep允许对文本文件进行模式查找。如果找到匹配模式, grep打印包含模式的所有行。
grep -选项 “搜索内容串” 文件名
选项 | 含义 |
---|---|
-v | 显示不包含匹配文本的所有行 |
-n | 显示匹配行及行号 |
-i | 忽略大小写 |
搜索目录需要添加参数:- r
grep -r “查找的关键字” 路径
把一系列文件归档到一个大文件中,也可以把档案文件解开。
格式:tar [参数] 打包文件名 文件
参数 | 含义 |
---|---|
-c | 生成档案文件,创建打包文件 |
-v | 列出归档解档的详细过程,显示进度 |
-f | 指定档案文件名称,f后面一定是.tar文件 |
-x | 解开档案文件 |
-t | 列出档案包含的文件 |
tar与gzip命令结合使用 实现文件打包、压缩
tar只负责打包文件,不压缩,用gzip压缩tar打包后的文件,扩展名一般为xxxx.tar.gz
格式:gzip [选项] 被压缩文件
选项 | 含义 |
---|---|
-d | 解压 |
-r | 压缩 |
打包和压缩同时进行:
用参数-z指定压缩包格式.gz
比如,打包并压缩目录
扩展名为xxx.tar.bz2
压缩用法:tar -jcvf 压缩包包名 文件
解压用法:tar -jxvf 压缩包包名
注意:可以用tar -xvf 文件名 万能解压bzip2 gzip
通过zip压缩文件的目标文件不需要指定扩展名,默认为zip。
压缩文件:zip -r 目标文件 源文件
解压文件:unzip -d 解压后目录文件 压缩文件
Linux系统是一个多用户系统,不同的用户处于不同的地位,对文件和目录有不同的访问权限。为了保护系统的安全性,Linux系统除了对用户权限作了严格的界定外,还在用户身份认证、访问控制、传输安全、文件读写权限等方面作了周密的控制。
可以从以下三种方式限制访问权限:
1.只允许用户自己访问(所有者)
所有者就是创建文件的用户。
2.允许一个预先指定的用户组中的用户访问(用户组)
用户组合成用户组。例如,某一类或某一项目中的所有用户都能够被系统管理员归为一个用户组,一个用户能够授予所在用户组的其他成员的文件访问权限。
3.允许系统中任何用户访问(其他用户)
用户也将自己的文件向系统内的所有用户开放,在这种情况下,系统内的所有用户都能够访问用户的目录或文件。在这种意义上,系统内的其他所有用户就是 other 用户类。
读权限(r)
对文件而言,读取文件内容。对目录而言,可以浏览目录。
写权限(w)
对文件而言,可以修改文件内容。对目录而言,可以删除、移动目录内的文件。
可执行权限(x)
对文件而言,可以执行文件。对目录而言,可以进入目录。
注意:Linux系统只允许文件所有者或者超级管理员改变文件或目录的权限。
chmod修改文件权限有两种格式:字母法与数字法。
字母法:chmod u/g/o/a +/-/= rwx 文件
[u/g/o/a] | 含义 |
---|---|
u | 表示文件所有者 |
g | 表示用户组,文件所有者属于同一组 |
o | 表示其他以外的人 |
a | 表示这三者皆是 |
+/-/= | 含义 |
---|---|
+ | 增加权限 |
- | 撤销权限 |
= | 设定权限 |
rwx | 含义 |
---|---|
r | 读 |
w | 写 |
x | 可执行 |
新创建一个文件,其他用户的权限只有读,这里增加写权限。
撤销和设定权限。
数字法:rwx这些权限用数字代替。
r | 数字为“4” |
w | 数字为“2” |
x | 数字为“1” |
- | 不具任何权限,数字为“0” |
例如:执行 chmod u=rwx,g=rx,o=r filename
等价于执行 chmod 754 filename
注意:例如chmod -R 777 test/ 递归test目录下所有文件,并更改权限为777。
删除
sudo apt remove xxx
更新
sudo apt update
linux下的安装包格式为.deb
安装
sudo dpkg -i xxx.deb
卸载
sudo dpkg -r 软件名
应用场景:将默认输出改到文件中,方便查看。
标准输入 代码0 默认设备为键盘
标准输出 代码1 默认设备为屏幕
错误输出 代码1 默认设备为屏幕
以目录树方式查看目录的内容
ln命令主要用于创建链接文件。
链接文件分为:软链接和硬链接。
软链接:软链接不占用磁盘空间,源文件删除则软链接失效。
硬链接:硬链接只能链接普通文件,不能链接目录。
注意:软链接存储的是链接的文件的地址,此外,如果源文件和链接文件不在同一个目录,源文件最好用绝对路径。
硬链接:只能链接普通文件,不能链接目录。
格式: ln 源文件 链接文件
权限一样,指向同一块内存空间,一个删除不干扰另一个。
readlink命令读取符号链接文件的内容(存储目标文件的路径)。
vi有三种基本工作模式:命令模式、文本输入模式(编辑模式)、末行模式。
不管用户处于何种模式,只要按一下esc就可进入命令模式。
在该模式下,用户可以输入各种合法的vi命令。
在命令模式下,输入插入命令(i)、附加命令(a)、打开命令(o)、替换命令(s)都可以进入编辑模式,此时vim窗口最后一行会显示插入。
i在光标处插入,a光标自动向后移动一位,o另起一行编辑,光标处字符自动删除
末行模式,用户可以对文件进行一些附加处理。
在命令模式下,输入冒号:即可进入末行模式。此时vim窗口状态行会显示:,待用户输入完成按下回车后,自动回到命令模式。
vim filename
如果filename不存在,就新建一个。
在命令模式输入i
第一步:esc进入命令模式
第二步:按下shift + zz保存退出
按键 | 功能 |
---|---|
i | 光标当前位置处插入文字 |
I | 光标所在行首插入文字 |
o | 光标下一行插入文字(新行) |
O | 光标上一行插入文字(新行) |
A | 光标所在行尾插入文字 |
s | 删除光标后边的字符,从当前位置插入 |
S | 删除光标所在行,从行首插入 |
按键 | 功能 |
---|---|
ctrl + f | 向前滚动屏幕 |
ctrl + b | 向后滚动屏幕 |
gg | 到文件第一行行首 |
G | 到最后一行行首 |
mgg | 到指定的m行 |
0 | 光标移动到行首 |
按键 | 功能 |
---|---|
[n]yy | 复制从当前行开始的n行 |
p | 把粘贴板上的内容插入到当前行 |
按键 | 功能 |
---|---|
[n]x | 删除光标后n个字符 |
[n]X | 删除光标前n个字符 |
D | 删除从光标所在到行尾的所有字符 |
[n]dd | 删除从当前行开始的n行 |
dG | 删除光标所在位置到文件尾的所有字符 |
dgg | 删除从文件首到光标所在位置的所有字符 |
按键 | 功能 |
---|---|
. | 执行上一次操作 |
100. | 执行上一次操作一百次 |
u | 撤销前一个命令 |
ctrl + r | 反撤销 |
按键 | 功能 |
---|---|
/字符串 | 从当前位置向下查找 |
?字符串 | 从当前位置向上查找 |
n和N切换查找内容
按键 | 功能 |
---|---|
r | 替换当前字符 |
R | 进入替换模式 |
按键 | 功能 |
---|---|
v | 按字符移动,选中文本,使用d删除,使用y复制 |
shift + v | 行选 |
ctrl + v | 列选 |
按键 | 功能 |
---|---|
:wq | 保存退出 |
:x | 保存退出 |
:w filename | 保存到指定文件 |
:q! | 退出,不保存 |
按键 | 功能 |
---|---|
: s/abc/123 | 光标所在行的第一个abc替换为123 |
: s/abc/123/g | 光标所在行的所有abc替换为123 |
: 1,10s/abc/123/g | 一至十行的所有abc替换为123 |
: %s/abc/123/g | 当前文件的所有abc替换为123 |
按键 | 功能 |
---|---|
: sp 文件名 | 当前文件和另一个文件水平分屏 |
: vsp 文件名 | 当前文件和另一个文件垂直分屏 |
: ctrl + w+w | 在多个分屏窗口间切换 |
编译命令格式:
gcc [options] file …
g++ [options] file…
由编译器在链接时,将库的内容加入到可执行程序中。
优点:对运行环境依赖小,具有较好兼容性。
缺点:
生成的程序比较大,需要更多的系统资源。
库函数有了更新,必须重新编译应用程序。
链接器在链接时,仅仅建立与所需库函数之间的链接关系,在程序运行时才将资源调入可执行程序。
优点:
在需要的时候才会调入对应的资源函数。
简化程序的升级,有较小的程序体积。
实现进程之间的资源共享。
缺点:
依赖动态库,不能独立运行。
依赖版本问题严重。
系统默认采用动态链接,如果想采用静态链接编译,加入-static参数。
所谓“程序库”就是包含了数据和执行码的文件,不能单独执行,可以作为其他执行程序的一部分来完成某些功能。
静态库的命名一般分为三部分:
在使用ar时候需要添加参数:rcs
静态库制作完成后,需要将.a和头文件一起发给用户。
假设测试文件为test.c,静态库文件为libtest.a,头文件为add.h和sub.h。
编译命令:
gcc test.c -L. -I. -ltest -o test
动态库在程序编译时不会被链接到目标代码中,而是在运行时候才被载入。不同的应用程序如果调用相同的库,内存中只需要有一份该共享库的实例,规避了静态库对空间的浪费。
动态库的命名分为三个部分:
所以最终名字为:libxxx.so
当系统加载可执行代码的时候,需要知道所依赖库的名字以及绝对路径,此时就需要系统动态载入器。
把export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径 ,设置到~/.bashrc或者/etc/profile文件中。
GNU工具集中的调试器是GDB,该程序是一个交互式工具,工作在字符模式。
GDB主要帮你完成以下四个方面的功能:
要调试C/C++的程序,我们要把调试信息加到可执行文件中,使用编译器的-g参数可以做到。
gcc -g test.c -o test
g++ -g test.c -o test
命令:gdb 执行文件
set args 可指定运行时候的参数
show args 查看设置好的参数
run 程序开始执行,如果有断点,停在第一个断点处。
start 程序向下执行一行。
用list打印程序的源代码,默认显示10行。
info b:查询所有断点
b设置断点。
b 10:在第十行设置断点
b function:在function函数入口处设置断点。
d 1-3:删除断点号1-3的断点。
dis 1-3:禁用断点号1-3的断点。
ena 1-3:启用断点号1-3的断点。
p 打印变量、字符串、表达式等的值。
p count 打印count的值。
可以设置一些自动显示的变量,当程序停住时,或者单步跟踪时,这些变量会自动显示。
一个工程中文件不计其数,按功能、类型、模块分别放在目录中,makefile制定了一系列规则来指定,哪些文件先编译,哪些文件需要重新编译等。
主要解决两个问题:
1.大量代码的关系维护。把代码维护命令以及编译命令放在makefile文件中,然后再用make工具解析此文件自动执行相应命令,可实现代码的合理编译。
2.减少重复编译时间。在改动一个文件的时候,能判断哪些文件需要重新编译,减少时间。
目标:依赖文件列表
命令规则
Makefile基本规则三要素:
1.目标:通常是要产生的文件的名字
2.依赖文件:用来输入从而产生目标的文件
3.命令:make执行的动作
举例说明:
这里有三条规则。
all:依赖test1 test2
test1和test2:没有依赖
命令则都是输出一行话。
make [options] [-f filename] [targets]
[options]
[-f filename]
make默认在工作目录寻找GNUmakefile、makefile、Makefile
-f指定寻找的名字
[targets]
若使用make没有指定目标,默认是实现makefile文件内的第一个目标
指定了要实现的目标,可以是多个,用空格隔开。
系统调用:就是操作系统提供给用户程序调用的一组接口。用户可以通过这组接口来获得操作系统内核提供的服务。
库函数和系统调用的区别
库函数由两类函数组成:
1.不需要调用系统调用:不需要切换到内核态即可完成函数功能,比如字符串操作。
2.需要调用系统调用:需要切换到内核空间,这类函数通过封装系统调用实现功能,比如printf。
在终端输入man fopen,我们发现fopen的返回值包括一个errno。
我们使用全局错误码来查看错误类型。
每个进程都会分配虚拟地址空间,在32位机器上,该地址空间为4G。
打开现存文件或者新建文件的时候,系统会返回一个文件描述符,文件描述符用来指定已打开的文件。
这个文件描述符相当于这个已打开文件的标号,文件描述符是非负整数,是文件的标识,操作这个文件描述符相当于操作这个标识符所指定的文件。
每个进程都有一张文件描述符表,标准输入、标准输出、标准错误输出设备文件被打开,对应的文件描述符0、1、2记录在表中。
在程序运行起来后打开其他文件时,系统会返回文件描述符表中最小可用的文件描述符,并将此文件描述符记录在表中。
#include
#include
#include
int open(const char* pathname,int flags,mode_t mode);
功能:
打开文件,如果文件不存在则可以创建
参数:
pathname:文件打开的路径名及文件名
flag:打开文件的行为标志,必选项O_RDONLY,O_WRONLY,or O_RDWR
mode:这个参数,只有在文件不存在时有效,指新建文件时指定文件的权限。
返回值:
失败返回-1
成功返回打开的文件描述符
flag参数说明:
必选项:
O_RDONLY,只读
O_WRONLY,只写
O_RDWR,读写
#include
int close(int fd);
功能:
关闭已打开的文件
参数:
fd:文件描述符
返回值:
成功:0
失败:-1,并设置errno
当进程结束时候,内核会对所有未关闭的文件调用close。但是如果一个程序长年累月运行(如网络服务器),打开的文件描述符一定要使用后关闭,否则随着打开文件增多,会占用大量文件描述符和系统资源。
#include
size_t write(int fd, const void *buf, size_t count);
功能:
把指定数目的数据写到文件(fd)
参数:
fd : 文件描述符
buf : 数据首地址
count : 写入数据的长度(字节)
返回值:
成功:实际写入数据的字节个数
失败: - 1
#include
size_t read(int fd, void *buf, size_t count);
功能:
把指定数目的数据读到内存(缓冲区)
参数:
fd : 文件描述符
buf : 内存首地址
count : 读取的字节个数
返回值:
成功:实际读取到的字节个数
失败: - 1
#include
#include
off_t lseek(int fd, off_t offset, int whence);
功能:
改变文件的偏移量
参数:
fd:文件描述符
offset:根据whence来移动的位移数(偏移量),可以是正数,也可以负数,如果正数,则相对于whence往右移动,如果是负数,则相对于whence往左移动。如果向前移动的字节数超过了文件开头则出错返回,如果向后移动的字节数超过了文件末尾,再次写入时将增大文件尺寸。
whence:其取值如下:
SEEK_SET:从文件开头移动offset个字节
SEEK_CUR:从当前位置移动offset个字节
SEEK_END:从文件末尾移动offset个字节
返回值:
若lseek成功执行, 则返回新的偏移量
如果失败, 返回-1
所有打开的文件都有一个当前文件偏移量(current file offset),以下简称为 cfo。cfo 通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数。
读写操作通常开始于 cfo,并且使 cfo 增大,增量为读写的字节数。文件被打开时,cfo 会被初始化为 0,除非使用了 O_APPEND 。
#include
#include
#include
int stat(const char *path, struct stat *buf);
int lstat(const char *pathname, struct stat *buf);
功能:
获取文件状态信息
stat和lstat的区别:
当文件是一个符号链接时,lstat返回的是该符号链接本身的信息;
而stat返回的是该链接指向的文件的信息。
参数:
path:文件名
buf:保存文件信息的结构体
返回值:
成功: 0
失败: -1
struct stat结构体说明:
struct stat {
dev_t st_dev; //文件的设备编号
ino_t st_ino; //节点
mode_t st_mode; //文件的类型和存取的权限
nlink_t st_nlink; //连到该文件的硬连接数目,刚建立的文件值为1
uid_t st_uid; //用户ID
gid_t st_gid; //组ID
dev_t st_rdev; //(设备类型)若此文件为设备文件,则为其设备编号
off_t st_size; //文件字节数(文件大小)
blksize_t st_blksize; //块大小(文件系统的I/O 缓冲区大小)
blkcnt_t st_blocks; //块数
time_t st_atime; //最后一次访问时间
time_t st_mtime; //最后一次修改时间
time_t st_ctime; //最后一次改变时间(指属性)
};