第一天内容:
1>. 命令解析器
2>. Linux快捷键
3>. Linux 系统目录结构
4>. 用户目录
5>. 文件和目录操作
6>. 文件和目录的属性
7>. 文件权限, 用户, 用户组
8>. 文件的查找和检索
9>. 软件的安装和卸载
10>. U盘的挂载和卸载
1. 命令解析器:
shell -- unix操作系统
bash -- Linux操作系统
本质: 根据命令的名字, 调用对应的可执行程序
2. Linux 快捷键
1>. 命令和路径补齐:
2>. 主键盘快捷键:
1). 历史命令切换:
历史命令:history
向上遍历:ctrl+p
向下遍历:ctrl+n
2). 光标移动:
向左:ctrl+b
向右:ctrl+f
移动到头部:ctrl+a
移动到尾部:ctrl+e
3). 删除字符:
删除光标后边的字符:ctrl+k
删除光标前边的字符:ctrl+d
删除光标前的所有内容:ctrl+u
3. Linux系统目录结构:
1>. 根目录:
2>. /bin:
bin是Binary的缩写,这个目录存放着经常使用的命令
3>. /dev:
dev是Device(设备)的缩写,改目录下存放的是Linux的外部设备,
在linux中访问设备的方式和访问文件的方式相同
4>. /etc:
这个目录存放所有系统管理所需要的配置文件和子目录
5>. /home:
用户主目录,在Linux中,每个用户都有自己的目录,一般该目录是以用户的账户名命名
6>. /lib:
这个目录存放着系统最基本的动态链接库,其作用类似于Windows里面的DLL文件,
几乎所有应用程序都需要用到这些库
7>. /media:
系统会自动识别一些设备,例如U盘、光驱等等,当识别后、linux会把识别的设备挂在到这个目录
8>. /mnt:
系统提供该目录是为了让用户临时挂载被的文件系统,我们可以将光驱挂载在/mnt/上,然后进入该
目录查看光驱里的内容了
9>. /root:
该目录为超级用户
10>. /usr:
11>. /boot:
存放的是启动linux时使用的一些核心文件,包括一些连接文件以及镜像文件
12>. /lost+found:
这个目录一般情况下是空的,当系统非法关机后,这里存放了一些文件
4. 用户目录:
1>. 绝对路径: 从根目录开始写 /home/itcast/aa
2>. 相对路径: bb 相对于当前的工作目录而言
. -> 当前目录
.. -> 当前的上一级目录
- -> 在临近的两个目录直接切换 cd -
3>. itcast@ubuntu:~$
itcast: 当前登录用户
@: at 在
ubuntu: 主机名
~: 用户的家目录(宿主目录)
$: 当前用户为普通用户
#: 超级用户 -- root
5. 文件和目录操作
1>. 查看我的资产(目录)
1). tree -- 必须安装该软件
2). ls -la
2>. 在情人和前妻之间徘徊:
cd 情人目录
cd
回家安抚老婆孩子: (三种回家方式)
cd /home/aaa
cd ~
cd
查看我当前是在老婆, 前妻, 还是情人的床上:
pwd
3>. 给情人买房子(创建目录)
一间小屋: mkdir dirName
一套别墅: mkdir dir/dir1/dir2 -p
4>. 趁前妻不在的时候卖掉前妻的一间房子: 删除空目录
5>. 给妻子买一个和田玉的手镯:
6>. 没收情人的所有财产:
别墅:
首饰:
7>. 给妻子置办一份财产, 跟情人的一模一样
8>. 妻子查看清单中的内容(5种方式):
9>. 妻子使用了黑科技, 不管在哪儿都能迅速来到我身边(快捷方式):
10>. 妻子将我的财产做了备份
6. 文件或目录属性: (理解内容, 非重点)
1>. wc 查看文本文件的信息
2>. od
3>. du 查看当前目录的大小 du -h
4>. df
7. 文件权限, 用户, 用户组
1>. 查看当前登录用户:
2>. 修改文件权限:whomai
1). 文字设定法: chmod [who] [+|-|=] [mode]
who:
文件所有者: u
文件所属组: g
其他人: o
所有的人: a
+: 添加权限:
-: 减少权限
=: 覆盖原来的权限
mode:
r: 读
w: 写
x: 执行
2). 数字设定法:
- : 没有权限
r: 4
w: 2
x: 1
765
7 -- rwx -- 文件所有者
6 -- rw -- 文件所属组
5 -- rx -- 其他人
3>. 改变文件或目录的所有者或所属组:
4>. 改变文件或目录所属的组:
8. 查找和检索
1>. 按文件属性查找:
1). 文件名:find + 查找的目录 + -name + "文件的名字"
2). 文件大小: find + 查找目录 + -size + +10k
3). 文件类型: find + 查找目录 + -type + d/f/b/c/s/p/l
2>. 按文件内容查找:
grep -r "查找的内容" + 查找的路径
9. 软件的安装和卸载
1>. 在线安装:
2>. deb包安装:
3>. 源码安装:
案例: 安装 svn
a. ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
b. make
c. sudo make install
10. U盘的挂载和卸载
历史命令向上滚动: ctrl+p
下: ctrl +n
删除光标后边的字符: 光标覆盖的字符 ctrl+d
前..: ctrl+h backspace
行首: ctrl+a
行尾: ctrl+e
tab: 自动补齐
根目录: /
ls aa
tree
ls -la
cd .
cd ..
cd /home/itcast
cd ~
cd
cd -
mkdir aa
mkdir aa/bb/cc -p
rmdir -- del kong
rm -r dir
touch a.txt
rm a.txt
cp a.txt b.txt
cp dir1 dir2 -r
cat
more
less
head
tail
1. vim编辑器的使用
2. gcc编译器
3. 静态库的制作 -- lib
4. 动态库的制作 -- dll
5. gdb调试
vi -- vim
vim是从vi发展过来的一款文本编辑器
vi a.txt
前提: 安装了vim软件
工作模式:
1. 命令模式 -- 打开文件之后, 默认进入命令模式
2. 编辑模式 -- 需要输入一些命令, 切换到编辑模式
3. 末行模式 -- 在末行模式下可以输入一些命令
1. vim编辑器的使用
命令模式下的操作:
1>. 光标的移动
H J K L
前 下 上 后
行首: 0
行尾: $
文件开始位置: gg
文件末尾: G
行跳转: 300G
2>. 删除操作
删除光标后边的字符: x
........前......: X
........单词: dw (光标移动到单词的开始位置, 否只能删除一部分)
...光标到行首的字符串: d0
.........行尾.......: D(d$)
删除光标当前行: dd
删除多行: ndd (n -- 自然数)
3>. 撤销操作
撤销: u
反撤销: ctrl + r
4>. 复制粘贴
复制: yy
复制多行: nyy
粘贴: p (光标所在行的下一行)
粘贴: P (光标所在行)
剪切 == 删除
5>. 可视模式
切换到可是模式: v
选择内容: hjkl
操作: 复制: y 删除: d
6>. 查找操作
1). /hello
2). ?hello
3). # -- 把光标移动到查找的单词身上 , 按#
遍历时候的快捷键: N/n
7>. r: 替换当前字符
缩进:
向右: >>
向左: <<
8>. 查看man文档
文本模式下的操作:
切换到文本模式:
a -- 在光标所在位置的后边插入
A -- 在当前行的尾部插入
i -- 在光标所在位置的前边插入
I -- 在光标所在行的行首插入
o -- 在光标所在行的下边开辟一个新的行
O -- .............上.........
s -- 删除光标后边的字符
S -- 删除光标所在的行
末行模式下的操作:
查找: :s/tom/jack/g
:%s/tom/jack/
:20,25s/tom/jack/g
保存退出:
q: 退出
q!: 退出不保存
w: 保存
wq: 保存退出
x: == wq
在命令模式下保存退出: ZZ
分屏操作:
1>. 水平分屏
2>. 垂直分屏
2. gcc编译器
1>. gcc工作流程
2>. gcc的一些参数使用
1). -I+目录 指定头文件目录
2). -c 生成二进制文件
3). -o 对编译后的执行文件名字进行指定
4). -D 编译时可以指定宏
5). -g 在程序中添加调试信息
6). -Wall 输出警告信息
7). -O 对程序进行优化 最高为 O3
3. 静态库的制作
1>. 命名规则
1). lib + 库的名字 + .a
2). libmytest.a
2>. 制作步骤:
1). 生成对应的.o文件 -- .c --> .o -c
2). 将生成的.o文件打包 ar rcs + 静态库的名字(libMytest.a) + 生成的所有的.o
3>. 发布和使用静态库:
1). 发布静态库 gcc main.c lib/libMyCalc.a -o sum -I include
gcc main.c -I include -L lib -l MyCalc -o app
2). 头文件
4>. 优缺点:
4. 共享库的制作:
1>. 命名规则:
1). lib + 名字 + .so
2>. 制作步骤:
1). 生成与位置无关的代码 (生成与位置无关的.o)
gcc -fPIC -c *.c
2). 将.o打包成共享库(动态库)
gcc -shared -o libMyCal.so *.o
3>. 发布和使用共享库:
gcc main.c lib/libMyCal.so -o app -Iinclude
gcc main.c lib/libMyCal.so -o app -Iinclude
gcc main.c -Iinclude -L./lib -lMyCalc -o myapp
4>. 解决程序执行时动态库无法被加载的问题:
1). 放到系统的库目录 中 -- 不允许使用
2). 临时测试
环境变量: LD_LIBRARY_PATH=将动态库的路径设置给该变量
将设置的值, 导入到系统环境变量中: export LD_LIBRARY_PATH
当终端关闭, 设置会失效
3). 不常用的方法(永久设置):
在家目录的 .bashrc文件 中添加一句话: export LD_LIBRARY_PATH=动态库目录的绝对路径
.bashrc修改完成, 需要重启终端
4).
1. 需要找动态连接器的配置文件 -- /etc/ld.so.conf
2. 动态库的路径写到配置文件中 -- 绝对路径
3. 更新 -- sudo ldconfig -v
tar zxvf
tar jcvf
5>. 优缺点:
5. gdb调试
int a = 10;
int b = a;
int c = b;
int d = c;
d=10
1. gdb调试
2. makefile的编写
3. 系统IO函数
1. gdb调试:
1. 启动gdb
start -- 只执行一步
n -- next
s -- step(单步) -- 可以进入到函数体内部
c - continue -- 直接停在断点的位置
2. 查看代码:
l -- list
l 10(函数名)
l filename:行号(函数名)
3. 设置断点:
设置当前文件断点:
b -- break
b 10(函数名)
b fileName:行号(函数名)
设置指定文件断点:
设置条件断点:
b 10 if value==19
删除断点:
delete -- del - d
d 断点的编号
获取编号: info -- i
info b
4. 查看设置的断点
5. 开始 执行gdb调试
start
执行一步操作:
n
继续执行:
c
执行多步, 直接停在断点处:
5. 单步调试
进入函数体内部: s
从函数体内部跳出: finish
不进入函数体内部:
n
退出当前循环: u
6. 查看变量的值: p -- print
7. 查看变量的类型: ptype 变量名
8. 设置变量的值: set var 变量名 = 赋值
9. 设置追踪变量
display
取消追踪变量
undisplay 编号
获取编号: info display
10. 退出gdb调试
quit
2. makefile的编写:
1. makefile的命名
2. makefile的规则:
规则中的三要素: 目标, 依赖, 命令
目标:依赖条件
命令
子目标和终极目标的关系:
更新目标的原则:
3. makefile的两个函数
wildcard
patsubst
4. makefile的三个自动变量
$<
$@
$^
3. 系统IO函数
1>. 一些概念
文件描述符
PCB
C库函的IO缓冲区
2>. open
打开方式:
必选项:
O_RDONLY
O_WRONLY
O_RDWR
可选项:
O_CREAT
文件权限: 本地有一个掩码
文件的实际权限:
给定的权限
本地掩码(取反)
&
实际的文件权限
777
111111111
111111101
111111101
775
O_TRUNC
O_EXCL
O_APPEND
3>. read
返回值:
1. -1 读文件失败
2. 0 文件读完了
3. >0 读取的字节数
4>. write
返回值:
5>. lseek
返回值:
6>. close
返回值:
cpu 为什么要使用虚拟地址空间与物理地址空间映射?解决了什么样的问题?
1.方便编译器和操作系统安排程序的地址分布。
程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。
2.方便进程之间隔离
不同进程使用的虚拟地址彼此隔离。一个进程中的代码无法更改正在由另一进程使用的物理内存。
3.方便OS使用你那可怜的内存。
程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,
内存管理器会将物理内存页(通常大小为 4 KB)保存到磁盘文件。数据或代码页会根据需要在物理内存与磁盘之间移动。
app:main.o sub.o mul.o
gcc main.o sub.o mul.o -o app
gcc $^ -o $@
%.o:%.c
gcc -c $< -o $@
makefile中的自动变量
$<: 规则中的第一个依赖
$@: 规则中的目标
$^: 规则中的所有依赖
只能在规则的命令中使用
大文件
两种方式:
read write -- 每次读1个byte
getc putc -- 每次读一个byte
两种方式, 哪个效率高