第一天內容:
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
兩種方式, 哪個效率高