Linux入门
目录、文件和路径
系统目录
Linux的文件系统中只能有一个根目录,它没有父目录,其他目录都必须有父目录。
/ 根目录
/bin (Binary)存放必要的命令。
/boot 存放内核以及启动所需的核心文件,包括一些连接文件以及镜像文件。
/cdrom 只读光盘,用来存储大量数据的外部存储媒体。
/dev (Device)存放设备文件
/etc 存放系统配置文件
/home 普通用户的宿主目录,用户数据存放在其主目录中,一般以用户的账号命名的
/lib 存放必要的运行库
/lost+found 一般情况下为空,当系统非法关机后,这里就存放了一些文件。
/media 挂载U盘、光驱等设备。
/mnt 存放临时的映射文件系统,通常用来挂载使用。我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。
/opt 存放主机额外安装的软件。默认是空的。
/proc 存放存储进程和系统信息
/root 超级用户的主目录
/run 是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。
/sbin 存放系统管理程序。
/srv 存放一些服务启动之后需要提取的数据。
/sys 文件系统
/tmp 存放临时文件
/usr 存放应用程序,命令程序文件、程序库、手册和其它文档。
/var 系统默认日志存放目录
路径
- 绝对目录:从根目录出发,以斜杠开始的路径
- 相对路径:从本级目录出发,不以斜杠开始的路径
./ 本级目录
. ./ 上级目录
目录名以 . 开头,表示隐藏目录
用户和权限
linux是多用户的操作系统,多个用户可以同时登录操作,不同用户有不同的权限。
root用户有最高的权限;其他用户的权限有相应的限制
每个文件都有三组权限标志,分别针对所属用户,所属组和其他用户
每组权限又包括三种权限:读权限 r,写权限 w,执行权限 x
d:文件类型 | meaning |
---|---|
- | 普通文件 |
d | 目录 |
c | 字符设备 |
b | 块设备 |
p | 命名管道 |
s | 套接字 |
l | 链接文件(快捷方式) |
d rwx rwx rwx
(u) (g) (o)
权限代表值,可以用rwx表示,也可以用数值表示
rwx r-x r–
421 0
- 如果用户对一个文件有读权限,那么他就可以查看这个文件的内容;
- 如果有写权限,就可以修改文件的内容;
- 如果有执行权限,那么就可以把这个文件作为可执行文件来运行。
常用命令
基础命令
- su root/qingyu 切换用户(switch user)
- man 查看Linux上的手册页
man [n] item
n一般为1-8:
1 可执行程序
2 系统调用
3 可函数
q退出 - chgrp 群组名称,目录 改变群组名称(change group)
- chown 用户名,目录 修改用户名
-R 后加,递归,表示子文件可一起修改 - chmod 改变权限
chmod [-R] 0777
chmod u + r
g - w
o = x
a(ugo都有)
chomd u=rwx,og=rx tmp
chomd a-x tmp
目录处理类命令
- cd 进入某一目录(changedir)
- pwd 显示绝对路径表示的当前工作目录(print working dir)
- mkdir 创建目录 只能创建一个空目录
mkdir -p a/b/c依次创建多个空目录
mkdir -m 创建目录的同时设置权限 - rmdir 删除空目录(removedir)
rmdir -rf(递归强制删除)
文件,目录管理类命令
- ls 以列表方式查看目录名
ls -l 长格式显示,显示属性,也可以写作 ll
ls -a 显示所有文件,包括隐藏文件
ls -la 以长格式显示所有文件
ls -lh 以长整型且以MB、KB形式显示文件大小(ll -h) - cp 文件拷贝
cp 源,目标
cp -rf 强制拷贝(当有同名文件时)
cp -i 拷贝(遇到同名函数时,有提示)
cp -ir 连同子文件一起复制 - rmdir 删除目录,删除的目录必须为空目录
后可加-irf - mv 移动目录
mv 源文件 新文件
查看文件内容
- cat 从文件头到文件尾显示
- tac 从尾到头显示
- more 一页一页显示 只能下翻 空格下一页,回车下翻一行
less 一页一页显示 可以下翻,也可以上翻 pgup/pgdn - :f 显示当前文件名
ls -al | more 以长文件显示所有目录,包括隐藏文件,一页一页显示(管道符,前面内容作为输入)
- head [-n10] tmp 显示文件的前十行
tail 显示文件的后x行
head -n20 tmp | tail -n10 输出前十行-20行
-
压缩 tar -cvzf 文件名.tar.gz 指定文件目录
解压 tar -xvzf 文件名.tar.gz -
find 目录 -name 所找的文件名
find /home -name str*
-
ifconfig 查看或者配置虚拟机的IP地址
ifconfig etho ip 改动的IP地址 -
clear 清屏
-
touch 创建库文件
-
grep 强大的文件关键词搜索命令
grep 关键词 file -
软连接
相当于Windows的快捷方式
ln -s 源 软链接
vim文本编辑器
三种工作模式:
- 命令行模式(一般模式)
- 插入模式(编辑模式)
- 底行模式(命令列模式)
操作过程
- vim hello.c
- 命令模式到编辑模式 i
- 编辑
- 编辑模式到命令模式 esc
- 命令模式到底行模式 :
- 在底行模式下键入wq保存退出
在命令行模式下功能键
命令 | 功能 |
---|---|
yy | 复制光标所在行 |
[n]yy | 复制当前光标开始的n行 |
p | 粘贴复制到所在光标行 |
dd | 剪切当前光标所在行 |
[n]dd | 剪切当前光标开始的n行 |
/name | 查找光标之后名为name的字符串 x往后查找下一个 X往前查找下一个 |
G | 光标移动到文件尾 |
u | 取消前一个动作 |
d1g | 删除光标所在行到第一行的所有数据 |
dg | 删除光标所在行到末行的所有数据 |
gc | 询问是否删除 |
% | 全文替换 |
n1,n2 s/word1|word2/g
在n1和n2行间查找word1并替换为word2,也可以把”/”换成”#”
底行模式功能键
命令 | 功能 |
---|---|
:w | 保存 |
:q | 退出(系统提示是否保存) |
:q! | 强行退出 |
:wq | 保存后退出 |
:w[filename] | 另存为filename的文件 |
:set nu | 显示行号 |
:set nonu | 取消行号 |
:! | 不退出vim编辑器,继续执行命令 |
:open [file] | 可同时打开多个文件,显示第一个文件 |
:n | 切换到第二个文件 |
:N | 往前切换文件 |
:files | 显示打开的所有文件名 |
:sp+文件名 | 分屏显示 |
gcc编辑器
GNU cc(简称gcc)
gcc能够检测出语法错误,功能性错误是难题
C语言从源代码到可执行程序的过程:
- 预处理(预处理后的C语言程序.i)
- 编译(生成.s文件)
- 汇编(生成.o文件)
- 链接(生成可执行文件)
预处理做的操作:
- 头文件展开 -i gcc -E hello.c gcc -E hello.c >hello.i
- 宏替换 gcc hello.c -DMAX=100 (-D从外部定义宏)
-E 控制预处理 gcc -E hello.c -o hello.i
-S 只进行预处理和编译 gcc -S hello.i -o hello.s
-c 只进行预处理、编译和汇编,不链接成为可执行文件 gcc -c hello.s -o hello.o
-o file 指定生成的目标文件名file,gcc给出预设的可执行文件a.out gcc hello.o -o hello
-g 产生调试工具(GNU的gdb)所必要的符号信息,要想对编译出的程序进行调试,就必须要加入这个选项 gcc -g hello.c -o hello.out
-O 对程序进行优化编译,链接。可执行文件的执行效率可以提高,但是,编译连接的速度就要相应减慢
-O1 优化代码结果
-O2 比-O更好的优化编译、连接,但速度慢。
-O3 优化符号点的…
-Idirname 将dirname所指出的目录加入到程序头文件目录列表中
C程序中的头文件包含两种情况∶
- #include <myinc.h>
- #include “myinc.h”
他们之间的主要差别是:
- 对于<>类,预处理程序源文件在系统预设包含文件目录(如/usr/include等等)中搜寻相应的文件
- 而对于"",源文件则在当前目录中搜寻头文件,这个选项的作用是告诉源文件,如果在当前目录中没有找到需要的头文件,就到指定的dirname目录中去寻找。在程序设计中,如果我们需要的这种包含文件分别分布在不同的目录中,就需要逐个使用-I选项给出搜索路径。
-Ldirname 将dirname所指出的目录加入到程序函数链接库文件目录列表中
-lname 在连接时装载名字为“libname.a”的函数库,该函数库位于系统预设的目录或者由-L选项确定的目录下
-
例:-lm表示连接名为libm.a的库
-lm 编译文件时未找到…到libm.a中找 -
例:gcc hello.c -o hello -I /home/hello/include -L /home/hello/lib -lworld
-I /home/hello/include : 将/home/hello/include目录作为第一个寻找头文件的目录,寻找的顺序是:/home/hello/include–>/usr/include–>/usr/local/include
-L /home/hello/lib : 将/home/hello/lib目录作为第一个寻找库文件的目录,寻找的顺序是:/home/hello/lib–>/lib–>/usr/lib–>/usr/local/lib
-lworld : 在上面的lib的路径中寻找libworld.so动态库文件
.a 静态库
静态库的创建
- gcc -c 源文件.c
- ar rcs 静态库名(libmycal.a) 目标文件1 目标文件2
- gcc main.c -o main -L. -lmycal
/lib /usr/lib
优缺点:
- 库和文件拼在一起,文件大,浪费空间资源
- 在编译时加载(加载时机不同)
- 容易部署
- 由于静态库在编译时期打包在执行文件中,静态库更新就需要重新打包发布,比较麻烦;
.so 动态库
建立与库的映射关系
动态库的创建
- gcc -shared -fPIC -o 库名.so 源文件.c
动态库的使用
- gcc 源文件 ./库名.so -o 可执行文件名
优缺点:
- 在执行时加载
- 程序升级变得简单,动态库的更新可以独立于依赖他的应用程序,只更新动态库即可
-Wall : 生成所有警告信息 gcc hello.c -o hello -Wall
-w : 不生成任何警告信息
gdb调试器
功能:
- 运行程序
- 设置断点
- 动态查看变量状态
gcc -g demo.c -o demo
gdb demo(可执行文件)
run 运行显示结果
list 查看代码
设置断点
- break +行号
- break +行号+[if …]
- break+函数名
print sum
next step 单步调试
continue 跳过当前断点继续执行
info break 查看断点信息
delete+断点编号 删除断点
quit 退出
Make工程管理器
是一种可以提高编译效率的可以实现自动编译的工程管理器
自动编译体现在以下两点:
- 按照规定的编译逻辑进行编译
- 根据文件是否修改进行选择编译
makefile三元素:目标文件,依赖文件,命令
书写格式为:
- target file :dependence file
- Tab command
举个小例子->用“vim Makefile”命令进入写Makefile文件,文件代码如下:
hello:hello.o
@gcc hello.o -o hello
echo "make done!"
hello.o:hello.c
gcc -c hello.c
/*伪目标*/
.PHONY:clean install
clean:
rm -f hello hello.o
install:
mv ./hello /bin
//在命令前加*:表示不显示此条命令到终端
执行命令,生成目标所依赖的文件
从第一行开始执行,若依赖文件为目标文件时,跳到该目标文件执行
最后输入make命令进行汇编
为什么要先生成hello.o文件再生成可执行文件hello?原因如下:
若选择直接生成可执行文件,那么如果有多个源代码需要编译,第一次编译时需要将所有的文件从头编译,消耗大量时间,若此时修改其中一个源代码,再次编译时会同第一次编译时一样将所有文件从头编译,浪费大量时间;如果选择先生成hello.o文件的话,若修改其中一个源代码,再次编译时只需要从头编译修改的文件,其他文件可以迅速生成可执行文件,即省去了其他未被修改文件的预处理和编译过程,直接链接。即使用此种方法可以加快编译速度,提高工作效率。
script下的Makefile->总控下的makefile->功能makefile