文章目录
一、Linux
Linux安装
Linux系统目录结构
目录名称 | 解释 |
---|---|
/bin/ | Binaries,存放系统命令,普通用户和root都可以执行。 |
/boot/ | 系统启动目录,保存与系统启动相关的文件,如内核文件和启动引导程序(grub)文件等 |
/dev/ | Device,该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。该目录下的/null 目录等价于一个只写文件,并且所有写入它的内容都会永远丢失,而尝试从它那儿读取内容则什么也读不到,但/dev/null 对命令行和脚本都非常的有用,相当于windows中的回收站。 |
/etc/ | Etcetera,这个目录用来存放系统管理所需要的配置文件和子目录,如用户信息、服务的启动脚本、常用服务的配置文件等。 |
/home/ | 普通用户的主目录(也称为家目录)。在创建用户时,每个用户要有一个默认登录和保存自己数据的位置,就是用户的主目录,所有普通用户的主目录是在/home/ 下建立一个和用户名相同的目录 |
/lib/ | Library,系统使用的函数库的目录,这个目录里存放着系统最基本的动态链接共享库,其作用类似于Windows里的.dll文件,几乎所有的应用程序都需要用到这些共享库。 |
/media/ | Linux系统会自动识别一些设备,当识别后,Linux会把识别的设备挂载到这个目录下。 |
/mnt/ | 早期 Linux 中只有这一个挂载目录,并没有细分。系统建议这个目录用来挂载额外的设备。 |
/opt/ | Optional,第三方安装的软件保存位置。这个目录是放置和安装其他软件的位置,手工安装的源码包软件都可以安装到这个目录中,默认是空的。 |
/root/ | root的主目录。普通用户主目录在/home/ 下,root 主目录直接在/ 下。 |
/sbin/ | Superuser Binaries,保存与系统环境设置相关的命令,只有root可以使用这些命令进行系统环境设置,但也有些命令可以允许普通用户查看。 |
/srv/ | 该目录存放一些服务启动之后需要提取的数据。 |
/tmp/ | Temporary,临时目录。系统存放临时文件的目录,在该目录下,所有用户都可以访问和写入。 |
/usr/ | Unix Software Resource,Linux 系统中,所有系统默认的软件都存储在/usr 目录下,/usr 目录类似Windows系统中C:\Windows\ +C:\Program files\ 两个目录的综合体。 |
/var/ | Variable,这个目录用于存储动态数据,例如缓存、日志文件、软件运行过程中产生的文件等。 |
/run/ | 是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。 |
/lost+found/ | 当系统意外崩溃或意外关机时,产生的一些文件碎片会存放在这里。在系统启动的过程中,fsck工具会检查这里,并修复已经损坏的文件系统。这个目录只在每个分区中出现,例如,/lost+found 就是根分区的备份恢复目录,/boot/lost+found 就是/boot分区的备份恢复目录。 |
/proc/ | Processes,虚拟文件系统。该目录中的数据并不保存在硬盘上,而是保存到内存中。主要保存系统的内核、进程、外部设备状态和网络状态等。如/proc/cpuinfo 是保存 CPU 信息的,/proc/devices 是保存设备驱动的列表的,/proc/filesystems 是保存文件系统列表的,/proc/net 是保存网络协议信息的。 |
/sys/ | 虚拟文件系统。和/proc/ 目录相似,该目录中的数据都保存在内存中,主要保存与内核相关的信息。 |
Linux中mnt、media以及dev目录的区别:
/mnt/
目录存放手动挂载的硬件,/media/
目录存放自动挂载的硬件,载点都是由系统自动建立和删除的,二者没有本质的区别。
/dev/
不是存放设备的驱动程序,而是作为访问外部设备文件的接口。比如U盘插入linux系统后,用fdisk -l
查看分区,显示文件为/dev/sda1
。则我们可以将U盘挂载到/mnt/usb0
下,mount /dev/sda1 /mnt/usb0
即可。
Linux常用命令
adduser atreus #增加用户
sudo apt-get remove gcc #卸载gcc
#对于Linux中的[Y/n],回车即表示选择Y,输入n表示选择n
cat -n file.txt #查看文件内容,同时显示行号
cat /dev/null > file.txt #清空文件内容
#concatenate[kɔn'kætəneit]
chmod u+r hello.c #对属主增加读权限
chmod g+w hello.c #对组用户增加写权限
chmod o+x hello.c #对其他用户增加执行权限
chmod a-r hello.c #对所有用户去掉读权限
chmod 655 hello.c #r:4、w:2、x:1
clear #清空屏幕
cp file1.txt file2.txt file3.txt dir/ #多个文件复制到目录dir中
cp -r dir1/*.c dir2/ #将目录/dir1/中的所有.c文件复制到目录dir2中
deluser atreus #删除用户
diff test1.c test2.c -y -W 100
#-y:并列显示
#-w 100:在使用-y参数时,指定栏宽100
#"|"表示两行不同,"<"表示前面多一行,">"表示后面多一行
dpkg -i code_1.63.2-1639562499_amd64.deb #安装软件包
#dpkg是Debian package的简写,是为Debian专门开发的套件管理系统,用于软件的安装、更新和移除
#所有源自Debian的Linux的发行版都使用dpkg,例如Ubuntu
echo $PATH #查看PATH环境变量
export -p #显示所有环境变量
file test.c #查看文件类型
find dir/ -name *.c #查找指定目录下的.c文件
gedit file.txt #使用gedit打开文件
grep str dir/text.txt #在指定文件中进行字符串模式匹配
history 10 #显示最近的10条命令
ifconfig
ipcs -a #打印出所有进行进程间通信的信息
ipcs -q #打印出使用消息队列进行进程间通信的信息
kill -9 4428 #以SIGKILL信号终止PID为4428的进程
ln -s dir/ link-dir #为目录建立符号链接
{ L i n u x 四大类文件 { − :普通文件 d :目录文件 c / b :设备文件 l :链接文件 L i n u x 三小类文件 { − s :共享文件 − f :堆栈文件 − p :管道文件 \begin{cases} Linux四大类文件\begin{cases} -:普通文件\\ d:目录文件\\ c/b:设备文件\\ l:链接文件\\ \end{cases}\\ Linux三小类文件\begin{cases} -s:共享文件\\ -f:堆栈文件\\ -p:管道文件\\ \end{cases} \end{cases} ⎩ ⎨ ⎧Linux四大类文件⎩ ⎨ ⎧−:普通文件d:目录文件c/b:设备文件l:链接文件Linux三小类文件⎩ ⎨ ⎧−s:共享文件−f:堆栈文件−p:管道文件
man 1 printf #查看用户命令printf
man 2 open #查看系统调用open
man 3 printf #查看库函数printf
mkdir -m 666 dir/ #以666权限创建目录
mkdir -p dir1/dir2/dir3 #递归创建多级目录
mv file1.txt file2.txt file3.txt -t dir/ #将三个文件同时移动到目标目录
mv file1.txt file2.txt #文件重命名
ping -c 5 120.78.188.0 #连续ping五次
ps -ef
#UID:进程拥有者
#PID:进程ID
#PPID:父进程ID
#C:进程所占CPU百分比
#STIME:进程开始时间
#TTY:该进程在哪个终端上运行,若与终端无关显示'?'。若为pts/0等,则表示由网络连接的主机进程
#TIME:进程启动到现在的时间
#CMD:命令的名称和参数
pwd #默认显示逻辑路径
#-L:logical首字符缩写,表示显示逻辑路径(忽略软连接文件),取pwd系统环境变量的值
#-P:physical首字符缩写,表示显示物理路径时如果当前目录路径时软链接文件,则会显示软连接文件对应的源文件
#注意区分[逻辑路径-物理路径]与[绝对路径-相对路径]
rm -r dir/ #递归删除,常用于目录
rm -i file.txt #删除前询问,防止误删
rmdir dir #直接删除空目录
rmdir -p dir #递归删除非空目录
su - root #切换至root用户
sudo ./test #以root身份执行文件
systemctl start ssh #启动ssh服务
#在主机中开启了openssh服务,那么就对外开放了远程连接的接口
#openssh的服务端:sshd
#openssh的客户端:ssh
#ssh---------->sshd
#client server
tar命令 – 打包和备份的归档工具
{
必选
{
−
c
:建立压缩文档
−
x
:解压
−
t
:查看内容
−
r
:向压缩归档文件末尾追加文件
−
u
:更新原压缩包中的文件
可选
{
−
z
:有
g
z
i
p
属性的
−
j
:有
b
z
2
属性的
−
Z
:有
c
o
m
p
r
e
s
s
属性的
−
v
:显示所有过程
−
O
:将文件解开到标准输出
−
f
:指定文件,这个参数必选且为最后一个参数
\begin{cases} 必选\begin{cases} -c:建立压缩文档\\ -x:解压\\ -t:查看内容\\ -r:向压缩归档文件末尾追加文件\\ -u:更新原压缩包中的文件\\ \end{cases}\\ 可选\begin{cases} -z:有gzip属性的\\ -j:有bz2属性的\\ -Z:有compress属性的\\ -v:显示所有过程\\ -O:将文件解开到标准输出\\ \end{cases}\\ -f:指定文件,这个参数必选且为最后一个参数 \end{cases}
⎩
⎨
⎧必选⎩
⎨
⎧−c:建立压缩文档−x:解压−t:查看内容−r:向压缩归档文件末尾追加文件−u:更新原压缩包中的文件可选⎩
⎨
⎧−z:有gzip属性的−j:有bz2属性的−Z:有compress属性的−v:显示所有过程−O:将文件解开到标准输出−f:指定文件,这个参数必选且为最后一个参数
tar -zcvf test.tar.gz test.c #压缩test.c文件为test.tar.gz
tar -ztvf test.tar.gz #列出压缩文件内容
tar -zxvf test.tar.gz #解压文件
time ps -ef #显示指令执行时间
#real是指令实际执行时间
#user是指令在用户空间花费时间
#sys是指令在Kernel space中花费的时间
touch file.txt #创建空文件
tree -L 1 #只显示第一层文件及目录
二、编辑器vim
基本命令
命令 | 对应操作 |
---|---|
i,I | 进入输入模式:i为从目前光标所在处输入;I为在目前所在行的第一个非空格符处开始输入 |
a,A | 进入输入模式:a为从目前光标所在的下一个字符处开始输入;A为从光标所在行的最后一个字符处开始输入 |
o,O | 进入输入模式:o为在目前光标所在的下一行处输入新的一行;O为在目前光标所在的上一行处输入新的一行 |
r,R | 进入取代模式:r只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下ESC为止 |
:w | 将编辑的文件写入硬盘 |
:q | 离开 |
:q! | 强制离开不存储 |
:wq | 存储后离开 |
ZZ | 保存并退出 |
ZQ | 不保存强制退出 |
:w[filename] | 另存新文档 |
:v[filename] | 将目标文档写至光标后 |
:!command | 执行shell命令 |
dd | 剪切游标所在行 |
yy | 复制游标所在行 |
p,P | p为将已复制的数据粘贴在光标下一行,P则粘贴在游标当前行并将当前行下移 |
u | 撤销 |
. | 重复上一操作 |
gg | 移到第一行 |
G | 移到最后一行 |
nG | n为数字,移动到这个档案 |
/word | 向光标之下寻找一个名称为word的字符串 |
?word | 向光标之上寻找一个字符串名称为word的字符串 |
n | 重复前一个搜寻的动作 |
n | 反向重复前一个搜寻的动作 |
自定义vim
三、编译器gcc
gcc概述
gcc是GNU计划提供的编译器。
交叉编译
交叉编译是在宿主机上生成目标机上的可执行代码。
1.预处理:头文件展开(#include)、宏替换(#define)、条件编译(#ifdef),生成预处理文件(.i)
2.编译:检查语法、转成汇编、生成汇编文件(.s/.S)
3.汇编:编译汇编文件、生成目标文件(.o)
4.链接:链接所有目标文件、生成符号表、生成可执行文件
注:这里的文件扩展名只是标注给gcc看的,在Linux中文件没有扩展名。
gcc编译选项
1.-o:gcc hello.c -o hello
,o是output的意思,用于文件重命名,这里是将生成的可执行文件重命名为hello
2.-E:gcc -E hello.c > hello.i
,预处理,因为预处理信息正常会在终端输出,不会生成对应文件,所以这里通过重定向符输出到*.i文件
3.-S:gcc -S hello.c -o hello.s
,生成汇编文件
4.-c:gcc -c hello.c -o hello.o
,生成目标文件,不进行链接
5.-Idir:gcc -I./mm/nn hello.c -o hello
,指定头文件第三方搜索路径
6.-Wall:gcc -Wall hello.c -o hello
,显示全部警告
四、函数库
五、调试器gdb
编译生成可执行文件
使用参数-g,即gcc -g hello.c -o hello
,加上参数-g后,gcc会额外做以下两件事:
1.创建符号表,符号表包含了程序中使用的变量名称的列表
2.关闭所有的优化机制,以便程序执行过程中严格按照原来的C代码进行
调试
生成可执行文件后通过gdb hello
启动gdb。
1.list:查看程序,后面可以加函数名或行号,即list main
或list 15
2.break:添加断点,后面同样可以加函数名或行号,即break main
或break 15 if i = 1
3.info break:查看断点信息
4.delete:删除断点,后面加断点编号,即delete 3
删除三号断点
5.run:断点设置完毕便可通过run
命令运行程序
6.next:单步运行,不进入子函数
7.step:单步运行,进入子函数
next与step区别:
如果下一条要执行的语句是一个函数调用语句,
step就会进入到这个函数之中:
7 int main() {
(gdb) next #输入next
8 fun();
(gdb) step #输入step
fun () at hello.c:3
3 void fun() {
next就会直接越过这个函数(GDB在背地里悄悄地把这个函数执行完):
7 int main() {
(gdb) next #输入next
8 fun();
(gdb) next #输入next
Sakura.
10 return 0;
8.watch:为指定变量设置硬件观察点,当对应变量值发生改变时会进行提示,要与continue配合使用,而且要在run之后执行
watch的使用:
(gdb) break 6 #设置断点
Breakpoint 1 at 0x1155: file main.c, line 6.
(gdb) run #运行程序
Starting program: /home/atreus/0117/gdb/main
Breakpoint 1, main () at main.c:6
6 int sum = 0;
(gdb) watch sum #设置硬件观察点
Hardware watchpoint 2: sum
(gdb) continue #继续运行
Continuing.
Hardware watchpoint 2: sum
Old value = 0
New value = 1
main () at main.c:8
8 for(int i = 1; i <= 10; i++)
9.continue:继续运行至下一个断点或硬件观察点处
10.print:查看指定变量值,后面加变量名,即print sum
11.display:查看指定变量值,会一直显示
12.finish:运行程序直到当前函数执行结束,一般用于子函数跳出,无法在主函数中执行
调试完毕后可通过quit
退出gdb。
六、工程管理器make
makefile概述
一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因此makefile就像一个Shell脚本一样,也可以执行操作系统的命令。
makefile的使用
此外,在makefile中,还存在系统默认的自动化变量:
$^
:代表所有的依赖文件$@
:代表目标$<
:代表第一个依赖文件