Linux複習知識

星碼發表於2020-12-28

二、常用 Shell 命令

  1. 理解 Linux 作業系統“一切皆檔案”的思想:
    因為linux將檔案作為一切可用資源的使用介面.“一切資源”包括記憶體、磁碟、其他各種裝置、程式間的通訊,還有網路通訊。這是一種簡化的思想,把一切資源都簡化為檔案展示出來,將這些對資源的操作簡化為對檔案的操作。
  2. 掌握常用的檔案處理命令,包括 ls、cd、pwd、touch、mkdir、cp、mv、
    rm
    檔案處理命令:ls(在windows下使用dir來顯示目錄檔案,表示directory)
    命令名稱ls
    英文願意:list
    命令所在路徑:/bin/ls (在Linux下,命令存放的位置的不同,決定了該命令的執行許可權的不同)
    執行許可權:所有使用者
    功能:顯示目錄或檔案
    語法:ls 選項[-ald][檔案或目錄(引數)]
    -a(all)顯示所有檔案,包括隱藏檔案,如果只是ls,就看不到隱藏檔案
    -l(long)詳細資訊顯示
    -d(directory)檢視單獨一個目錄的詳細資訊

drwxr-xr-x 2 root root 4096 12-01 20.52 bin
----------------------drwxr-xr-x:(永遠都是10個字元,不夠得用-表示)
第一個字元:d是檔案型別,常見的檔案型別有三種,
d 表示目錄

  • 表示“二進位制檔案”-rw-r-r,上面講過,Linux下所有不是目錄和特殊檔案的,都可以稱為二進位制檔案
    l 表示軟連結檔案 link
    (還有s開頭的,等等,這些是特殊檔案,我們以後再學)

以後的9個字元rwxr-xr-x,表示許可權,
r:read 讀許可權
w: write 寫許可權
x:execute 執行許可權(windows下的.exe檔案就是這個意思,表示可以執行檔案)
我們可以將其每三個拆為一組:rwx r-x r-x
每一組對應一種使用者,
第一組:檔案擁有者u user或onwer 比如張三建立了這個檔案,這個檔案的所有者就是張三,當然所有者是可以轉讓的,
第二組:所屬組g(group) 組內(檔案也可以放在組內)使用者所具備對該檔案的操作許可權
第三組:其他人o(others)
--------------2 表示硬連結數
root root 兩個root,第一個表示這個目錄的所有者是誰,第二個root表示該目錄的所屬組
時間 檔案建立的時間或者是檔案最後修改時間

檔案處理命令:cd
命令原意:change directory
命令所在路徑:shell內建命令
執行許可權:所有使用者
語法:cd [目錄] 中間有空格
功能:切換目錄
例:$cd / 切換到根目錄 $cd …回到上一級目錄 . 代表當前目錄

檔案處理命令:pwd
命令原意: print working directory
功能:檢視當前所在的目錄

檔案處理命令:mkdir
原意:make directories
所在路徑:/bin/mkdir
執行許可權:所有使用者
語法:mkdir [目錄名]
功能:建立一個目錄
例:mkdir /test
mkdir -p /test/parent/son
-p表示如果沒有父目錄,則幫忙建立父目錄

檔案處理命令:touch
命令所在路徑:/bin/touch
執行許可權:所有使用者
語法:touch [檔名]
功能:建立一個空檔案
存在的話相當於改變修改時間

檔案處理命令:cp
英文願意:copy
命令所在路徑:/bin/cp
執行許可權:所有使用者
語法:cp -r[原始檔或目錄][目的目錄] 原始檔可以同時是多個,即同時複製到多個檔案
-r 複製目錄

功能:複製檔案或目錄
例:cp /etc/inittab /etc/services /test/ 表示同時將etc/inittab檔案和etc/下的services複製到/test目錄下,**********目標可以不指定其檔名稱
注意:如果只是複製檔案,只要直接寫上cp即可,但是複製目錄的時候,一定要加上-r這個選項
cp -r /etc /test 表示將/etc目錄複製到/test目錄下,即test目錄下有一個etc目錄
(注意:etc目錄下存放的都是一些配置檔案,所以大多數都要將etc目錄備份一下,最簡單的備份方式就是copy到其他位置了,可以是分割槽,可以是硬碟)

檔案處理命令:mv
英文原意:move
命令所在路徑:/bin/mv
執行許可權:所有使用者
語法:mv [原始檔或目錄] [目錄目錄]
功能:移動檔案目錄(即剪下),也可以重新命名目錄或檔案, *****************Linux沒有rename這個命令
例:mv file1 file3
將當前目錄下檔案file1更名為file3
mv file2 dir2
將檔案file2移動到目錄dir2下
比如:mv services service將當前目錄下的services更名為service ******如果移動後不改變名稱,則可以不寫目標檔名稱,直接寫目錄,和
mv /test/inittab /tmp/ copy一樣,也可以同時移動多個檔案
將test/inittab檔案移動到/tmp/目錄下

檔案處理命令:rm
原意:remove
所在路徑:/bin/rm
執行許可權:所有使用者
語法:rm [檔案或目錄]
-r(選項) 遞迴刪除目錄(遞迴即深度到所有的子目錄下) 如果要刪除一個檔案,則不需加任何的選項
功能:刪除檔案 在用這種方式刪除一個檔案時,系統會提示是否確認刪除,此時需要敲入y,(實際上rm命令在Unit下,是直接刪除檔案的,但是Linux下,有別名機制,也就是rm也捆綁了一個選項,即-i,它會有一個詢問過程)但是我們可以使用rm -f file3 直接將檔案刪除,而不需要系統提示確認刪除例:rm file3 刪除檔案file3
rm -r dir1 刪除目錄dir1 rm -r test 刪除目錄test 在使用這種方式刪除一個目錄的時候,系統會提示你是否進入該目錄,然後再幫你一個一個刪除,如果目錄裡有很多檔案時,這種方式也不可取的,所以如果你非常確定要刪除該目錄,可以使用 rm -rf test 強制刪除(f 表示never prompt,從不詢問),而cp -rf /etc /test/etc.back 表示複製目錄/etc,並且如果目錄裡的檔案無法開啟,則強制開啟,並複製

檔案處理命令:rmdir
表示刪除“空目錄”。注意,是空目錄,這個命令用得很少,因為他是用來刪除空目錄的

  1. 掌握常用檔案檢視命令 cat、more、head、tail
    Cat:cat 是由“第一行到最後一行連續顯示在螢幕上”
    cat a.txt :檢視a.txt檔案的內容。
    cat -n a.txt :檢視a.txt檔案的內容,並且由1開始對所有輸出行進行編號。
    cat -b a.txt :檢視a.txt檔案的內容,用法與-n相似,只不過對於空白行不編號

More:more命令以一頁一頁的形式顯示,更方便使用者逐頁閱讀。按空白鍵(space)就往下一頁顯示,按 b 鍵就會往回(back)一頁顯示,輸入/+字串可以搜尋字串(與vi搜尋類似)
more +2 a.txt:從第二行開始顯示a.txt文件的內容

Head:head命令用於顯示檔案文字區塊。
head -n 5 a.txt : 顯示a.txt的前5行
head -c 5 a.txt : 顯示a.txt的前5個位元組

tail:tail命令用途是依照要求將指定的檔案的最後部分輸出到標準裝置,通常是終端,通俗講來,就是把某個檔案檔案的最後幾行顯示到終端上,假設該檔案有更新,tail會自己主動重新整理,確保你看到最新的檔案內容
tail -f a.txt : 檢視a.txt檔案的尾部內容(預設10行,相當於增加引數 -n 10)
tail -n 20 a.txt: 檢視a.txt最後20行。
tail -r -n 10 a.txt: 檢視a.txt最後10行。

  1. 掌握常用檔案搜尋命令 which、find、locate、grep;理解 locate 和 find的區別與聯絡;
    find:find命令是直接在硬碟中進行搜尋的
    在目錄中查詢指定檔案
    -name:按照檔名搜尋;在Windows搜尋中,只要檔名包含init就會被搜尋出來,但在Linux中,find命令是完全匹配的,必須和搜尋關鍵字一模一樣才會列出,是一種精確搜尋;

locate:locate 命令相比find命令而言,那就是搜尋速度非常快,而且耗費系統資源非常小。這是因為 locate命令不會直接搜尋硬碟空間,而會先建立 locate 資料庫,然後在資料庫中按照檔名進行搜尋,是快速查詢的搜尋命令。
在檔案資料庫查詢檔案
locate不是精準匹配 模糊

在使用查詢配置檔案位置時,發現locate開始返回是空,因為沒有更新資料庫
locate 與 find 不同: find 是去硬碟找,locate 只在 /var/lib/slocate 資料庫中找。
locate 的速度比 find 快,locate是查資料庫,所以 locate 的查詢並不是實時的,而是以資料庫的更新為準,一般是系統自己維護,也可以手工升級資料庫 ,命令為:updatedb

which命令:列出命令的所在路徑
[root@root ~]# which cp
alias cp=‘cp -i’
/bin/cp

grep命令:在檔案中搜尋匹配的行輸出
-i(忽略大、小寫) -v(排除輸出)
grep multiuser /etc/inittab

  1. 理解和掌握常用的許可權管理命令,包括 chmod、chown、chgrp 等
    chown:可以改變檔案(目錄)的屬主

chown將指定檔案的擁有者改為指定的使用者或組。使用者可以是使用者名稱或使用者ID。組可以是組名或組ID。檔案是以空格
分開的要改變許可權的檔案列表,支援萬用字元。
該命令的各選項含義如下:
- R 遞迴式地改變指定目錄及其下的所有子目錄和檔案的擁有者。
- v 顯示chown命令所做的工作。

chgrp: 可以改變檔案(目錄)的屬組
該命令改變指定指定檔案所屬的使用者組。其中group可以是使用者組ID,也可以是/etc/group檔案中使用者組的組名。檔名是以空格分開的要改變屬組的檔案列表,支援萬用字元。如果使用者不是該檔案的屬主或超級使用者,則不能改變該檔案的組。該命令的選項含義為: - R 遞迴式地改變指定目錄及其下的所有子目錄和檔案的屬組。
例1:$ chgrp - R book /opt/local /book 改變/opt/local /book/及其子目錄下的所有檔案的屬組為book。
chmod : 可以修改檔案(目錄)的許可權
u:屬主
g:屬組
o:其他人
a:所有人
+增加許可權,-代表減少許可權,=代表給定許可權

  1. 熟悉網路管理與通訊命令 ifconfig、netstat、ping、write、wall;
    ifconfig
    語法
    ifconfig 網路卡名稱 IP地址
    用途:檢視和設定網路卡資訊

netstat列印網路連線、路由表、介面統計、偽裝連線和多播成員關係

ping 選項 IP地址
-c 指定傳送次數
用途:測試網路連通性

write
語法
write <使用者名稱>
用途:給使用者發資訊,以ctrl+D儲存結束

wall
wall [message]
用途:發廣播資訊

  1. 熟練掌握壓縮解壓命令 gzip/gunzip、zip/unzip、bzip2/bunip2、tar等;
    gzip (不能壓縮目錄,只能壓縮檔案 )

命令名稱: gzip

所在路徑: /bin/gzip

執行許可權: 所有使用者

功能描述: 壓縮檔案,gzip壓縮和解壓後原檔案都刪除了

壓縮後檔案格式: .gz

gunzip (解壓縮後壓縮包刪除)
命令名稱: gunzip
英文原意: GUN unzip
所在路徑: /bin/gunzip
執行許可權: 所有使用者
功能描述: 解壓縮.gz的壓縮檔案

tar
命令名稱: tar
所在路徑: /bin/tar
功能描述: 打包目錄或檔案
壓縮後檔案格式: .tar.gz
語法: tar 選項[-zcf] [壓縮後的檔名] [目錄\檔案]
-c 打包
-v 顯示詳細資訊
-f 指定檔名
-z gz格式
-j bz2格式
範例: tar -zcvf 1.tar.gz 1.txt

tar命令解壓縮語法:
-x 解包
-v 顯示詳細資訊
-f 指定解壓檔案
-z gz格式
-j bz2格式
範例: tar -xzvf 1.tar.gz

zip (壓縮後原檔案存在 )
命令名稱: zip
所在路徑: /usr/bin/zip
執行許可權: 所有使用者
功能描述: 壓縮檔案或目錄
壓縮後檔案格式: .zip
語法: zip 選項[-r] [壓縮後檔名] [檔案或目錄]
-r 壓縮目錄
unzip (zip的解壓縮命令,解壓縮不分目錄和檔案)

bzip2
命令名稱: bzip2
所在路徑: /usr/bin/bzip2
執行許可權: 所有使用者
功能描述: gzip的升級版本,可以保留原檔案
壓縮後檔案格式: .bz2
-k 解壓縮後保留原檔案
tar -jcf 1.tar.bz2 1.txt (打包並壓縮)

bunzip2
命令名稱: bunzip2
所在路徑: /usr/bin/bunzip2
執行使用者: 所有使用者
功能描述: 解壓縮
語法: bunzip2 選項[-k] [壓縮檔案]
-k 解壓縮後保留原檔案
tar -jxf 1.tar.bz2 (解包解壓縮)

  1. 掌握常用幫助命令 man、info、whatis、whoami

三、常用開發工具

  1. 理解 VI/VIM 編輯器三種工作模式及切換方法
    命令模式(Command mode)、插入模式(Insert mode)、底行模式(Lastline mode)
    插入->命令:esc
    <- a i o
    命令模式->底行模式 : / 切換到底線命令模式,以在最底一行輸入命令
    <- 自動切換

  2. 理解 VI/VIM 編輯器在命令模式下游標移動的六個層次 (PPT第2章)
    命令模式下,游標移動可以分為:字元級,單詞級,行級,段落級,螢幕級,文件級

  3. 掌握 VI 編輯器地行模式下進行設定和取消行號、移動游標、檔案中查詢的方法;(PPT 第二章2.2.1)
    末行模式下 set number設定行號 set nonumber
    移動行 末行模式下直接輸入行號
    查詢:1、命令模式下輸入“/字串”,例如“/Section 3”。 2、如果查詢下一個,按“n”即可。

  4. 瞭解 GCC 編譯流程以及 GCC 編譯工具的使用方法;(2.1.2)
    預處理: 展開巨集定義 將include包含的檔案插入對應的位置,刪除註釋,新增行號和標識
    編譯階段,gcc會對經過預處理的檔案進行語法,詞法,語義分析,生成相應的彙編程式碼檔案
    彙編過程,將編譯後的彙編程式碼轉化成機器可以執行的命令—二進位制命令
    連線過程,組裝各個目標檔案的過程,會解決符號依賴和庫依賴關係,最終生成可執行檔案

• 1.預處理後的hello ->hello.i:
• 2.編譯 hello.c ->hello.s
• 3.彙編 hello.c -> hello.o
• 4.連結 hello.c -> hello
預處理,編譯,彙編,連結
預處理 -E 編譯 -S 彙編 -o 連線
5. 掌握 GDB 除錯工具的使用方法(2.1.3)
gdb除錯中常用的命令
l 看原始碼 r 執行 break n 在第n行設定斷點 n 單條語句執行 p 列印變數 finish 當前函式完成返回

  1. 掌握多檔案專案 Makefile 的編寫方法
    all:kmeans
    kmeans:main.o function.o
    g++ -o kmeans main.o function.o
    main.o:main.cpp
    g++ -c main.cpp
    function.o:function.cpp
    g++ -c function.cpp
    clean:
    rm -f *.o

四、使用者與使用者組管理

  1. 理解下列概念:使用者、檔案所有者、使用者組、檔案所屬組、其他使用者、root 使用者;
    使用者(user)的概念;
    普通使用者:只能對自己目錄下的檔案進行訪問和修改,具有登入系統的許可權
    使用者組(group)的概念;
    使用者組(group)就是具有相同特徵的使用者(user)的集合體;比如有時我們要讓多個使用者具有相同的許可權,比如檢視、 修改某一檔案或執行某個命令,這時我們需要使用者組,我們把使用者都定義到同一使用者組,我們通過修改檔案或目錄的許可權 ,讓使用者組具有一定的操作許可權,這樣使用者組下的使用者對該檔案或目錄都具有相同的許可權,這是我們通過定義組和修改文 件的許可權來實現的;
    檔案的所有者就是這個檔案的建立者,也可以通過chown來改變檔案所有者
    所屬組:組很明顯不止一個人,是多個人一起的。我們電腦上有一些開發手冊,這些手冊是給我們的開發組看的,所以我們這開發組的幾個成員都可以自己檢視這些開發手冊
    其他人:既不屬於所有者,也不屬於所屬組之外的成員,就可以理解為其他人
    超級使用者:擁有對系統的最高管理許可權,預設是root使用者

  2. 掌握使用者和使用者組管理命令:賬號的新增、修改和刪除;使用者組的添 加、刪除,使用者組屬性修改
    賬戶新增:
    #1 useradd命令 -u  指定使用者ID -m 自動建立使用者的登入目錄 -r  建立系統帳號。

賬戶修改
對於系統中已經存在的使用者賬號,可以使用usermod命令重新設定各種屬性。usermod命令同樣需要指定賬號名稱作為引數。
命令使用基本格式
usermod [選項] 使用者名稱
常用選項
-u:修改使用者的 UID 號。
-d:修改使用者的宿主目錄位置。

刪除
userdel 命令——刪除使用者賬號
當作業系統中的某個使用者賬號不再使用時(如該員工已經從公司離職等情況),可以使用 userdel 命令將該使用者賬號刪除。
命令使用基本格式
userdel [選項] 使用者名稱
常用選項
-r 同時刪除宿主目錄

組新增
#2 groupadd命令 -r:建立系統工作組
再使用chown chmod修改檔案對應的屬主和屬組,以及訪問許可權

修改
gpasswd 命令——新增、刪除組成員
gpasswd 命令本來是用於設定組賬號的密碼,但是該功能極少使用,實際上該命令更多地用來管理組賬號的使用者成員。
命令使用基本格式
groupadd [選項] 使用者名稱 組名
-a 新增組成員
-d 刪除組成員

刪除
groupdel 命令——刪除組賬號
當系統中的某個組賬號已經不再使用時,可以使用 groupdel 命令將該組賬號刪除。而新增指定的組賬號名稱作為引數。
命令使用基本格式
groupdel 組名

修改使用者組
chgrp www lifang
第一個引數 要改變的組
第二個引數 要改變的檔案或資料夾

  1. 使用者組切換
    如果一個使用者同時屬於多個使用者組,那麼使用者可以在使用者組之間切換,以便具有其他使用者組的許可權。使用者可以在登入後,使用命令newgrp切換到其他使用者組,這個命令的引數就是目的使用者組。
    newgrp 使用者組名稱

五、Shell 程式設計:

  1. 熟練掌握重定向、管道和命令連線符
    標準輸入檔案的編號0 標準輸出檔案編號1 標準錯誤檔案編號2
    輸出重定向
    命令 1> 檔名 命令 > 檔名

代表以覆蓋的方式將命令的正確輸出輸出到指定的檔案或裝置當中。

代表以追加方式將結果列印到檔案中。

錯誤重定向
命令 2> 檔名
2代表標準錯誤檔案的編號
使用運算子 & 通過檔案編號引用檔案,該運算子表示“等同於”, 2>&1 :將標準錯誤重定向到標準輸出中

輸入重定向
命令 < 檔名 命令 0< 檔名:把檔案作為命令的輸入
1.命令 >> 檔案 2>>&1 :以追加的方式,把正確輸出和錯誤輸出都儲存在檔案中。
2.命令&>檔名:以覆蓋的方式將正確和錯誤輸出都儲存在檔案中。
3.命令&>>檔名:以追加的方式將正確和錯誤輸出都儲存在檔案中。
命令 >> 檔案 2>&1 和 命令 &>>檔案作用相同
4.命令>>檔案A 2>>檔案B:正確的輸出到A檔案中,錯誤的輸出到B檔案中

管道符
用來連線兩個命令
命令格式:命令A|命令B,即命令1的正確 輸出 作為命令B的操作物件。

命令連線符
1、豎線
‘|’ ,在linux中作為管道符,將’|‘前面命令的輸出作為’|'後面的輸入
2、雙豎線 短路或
‘||’,用雙豎線’||'分割的多條命令,代表的是或者
執行的時候遵循如下規則,如果前一條命令為假,則繼續執行後面的命令,如果前一條命令為真,則後面的命令不會執行。
比如:輸入1小於2雙豎線輸出b,前面為真,後面不執行則沒有輸出b,輸入1大於2雙豎線echo b,前面為假則輸出b。
3、&& 短路且
可同時執行多條命令,代表的是且,當碰到執行錯誤的命令時,將不再執行後面的命令。如果一直沒有錯誤的,則執行完畢。
4、&
同時執行多條命令,不管命令是否執行成功

  1. 掌握 Shell 變數的定義和使用方法
    變數型別:
    系統環境變數
    自定義變數
    特殊符號變數

定義變數的方式有三種:
variable=value
variable=‘value’
variable=“value”
variable是變數名,value是賦給變數的值
如果value不包含任何空白符(例如空格、Tab等),那麼可以不使用引號;如果value包含了空白符,就必須用引號包圍起來

1.單小括號代表命令組,雙小括號代表著可以整數運算
2.使用[[ … ]]條件判斷結構,而不是[ … ],能夠防止指令碼中的許多邏輯錯誤。比如,&&、||、<和> 操作符能夠正常存在於[[ ]]條件判斷結構中

測試條件:
-a: and
-o: or
!: 非
字串
== 等於 兩邊要有空格 != 不等
整數

語法:
((表示式1,表示式2…))
特點:
1、在雙括號結構中,所有表示式可以像c語言一樣,如:a++,b–等。
2、在雙括號結構中,所有變數可以不加入:“$”符號字首。
3、雙括號可以進行邏輯運算,四則運算
4、雙括號結構 擴充套件了for,while,if條件測試運算
5、支援多個表示式運算,各個表示式之間用“,”分開

$() 等同於: ··(反引號):執行一段命令
$(()) 進行數字運算
#a=3;b=2;c=5
#echo $((a+b*c))

$[] $(()) :
它們是一樣的,都是進行數學運算的。支援+ - * / %:分別為 “加、減、乘、除、取模”。但是注意,bash只能作整數運算,對於浮點數是當作字串處理的。

注意:
1.=周圍不能有空格
2.shell中變數沒有資料型別 任何型別它都預設為字串
#雙分支if條件語句

if [ 條件判斷式 ]
then
條件成立時,執行的語句
else
條件不成立時,執行另外一段語句
fi

if [[ ${x} -ge y ] ] ; t h e n e c h o " {y} ]]; then echo " y]];thenecho"{x} -ge y : x 大 於 或 等 於 y " e l s e e c h o " {y}: x 大於或等於 y" else echo " y:xy"elseecho"{x} -ge ${y}: x 小於 y"
fi

  1. 掌握 Shell 中的語句與迴圈

while [[ condition ]]
do

語句

done

  1. 掌握 Shell 函式的構造和使用方法
    function_name ()
    {
    statement1
    statement2

    statementn
    }

function_name parm1 parm2

  1. 掌握 Shell 指令碼的除錯方法
    部落格地址

六、Linux 檔案系統與操作

  1. 瞭解磁碟分割槽和目錄結構
    磁碟上的碟片被細分為多個大小相同的扇區,扇區是磁碟空間的基本單位
    磁碟的第一個扇區非常重要,儲存了:主開機記錄(開機時,只有MBR中程式正確才開機),磁碟分割槽表(記錄每個分割槽的狀態),魔數
    目錄結構:
    是磁碟等儲存裝置上檔案的組織形式,主要體現在對檔案和目錄的組織方式上
    /etc: 這個是系統中的配置檔案,如果你更改了該目錄下的某個檔案可能會導致系統不能啟動。
    /bin, /sbin, /usr/bin, /usr/sbin: 這是系統預設的執行檔案的放置目錄,比如 ls 就是在 /bin/ls 目錄下的。
    值得提出的是,/bin, /usr/bin 是給系統使用者使用的指令(除root外的通使用者),而/sbin, /usr/sbin 則是給 root 使用的指令。
    /var: 這是一個非常重要的目錄,系統上跑了很多程式,那麼每個程式都會有相應的日誌產生,而這些日誌就被記錄到這個目錄下,具體在 /var/log 目錄下,另外 mail 的預設放置也是在這裡。
    /mut: 儲存掛載儲存裝置的掛載目錄

  2. 理解虛擬檔案系統;VFS
    系統中 “一切皆檔案” 概念的基礎 是 Linux 核心中的一個軟體層,用於給使用者空間的程式提供檔案系統介面;同時,它也提供了核心中的一個抽象功能,允許不同的檔案系統共存。系統中所有的檔案系統不但依賴 VFS 共存,而且也依靠 VFS 協同工作。
    為了能夠支援各種實際檔案系統,VFS 定義了所有檔案系統都支援的介面和資料結構;同時實際檔案系統也提供 VFS 所期望的抽象介面和資料結構,將自身的諸如檔案、目錄等概念在形式 上與VFS的定義保持一致。換句話說,一個實際的檔案系統想要被 Linux 支援,就必須提供一個符合VFS標準 的介面,才能與 VFS 協同工作。實際檔案系統在統一的介面和資料結構下隱藏了具體的實現細節,所以在VFS 層和核心的其他部分看來,所有檔案系統都是相同的。

  3. 掌握 ext2/ext3 檔案系統佈局;
    ext3完全相容ext2檔案系統的日誌檔案系統,在ext2基礎上增加了一個被稱為日誌的塊,專門記錄寫入或修訂檔案時的步驟

  4. 資料塊定址
    Linux中檔案的屬性資訊和資料分開存放,系統通過檔案inode的索引項Block查詢檔案資料
    Block[0]~[11]直接索引 [12]間接索引 [13]二級間接索引 [14] 三級間接索引

  5. 檔案型別
    ls -l列印檔案屬性資訊中的第一個字元代表檔案型別,有7個值
    d:目錄檔案 directory
    l:符號連結檔案 link
    s:套接字檔案 socket
    b:塊檔案 block
    c:字元裝置檔案 character
    p:管道檔案 pile
    -:普通檔案
    有四種檔案:普通檔案,目錄檔案,裝置檔案(b c),特殊檔案(p s l)

  6. 掌握 Linux 系統中實現 I/O 操作的方法,理解檔案描述符,檔案作業系統呼叫中常用的巨集定義
    檔案描述符:
    實質是一個索引值,儲存於由核心維護的該程式開啟的檔案描述符表中
    存在於程式的檔案描述符是程式級別
    當程式開啟一個現有檔案或者建立一個新檔案時,核心向程式返回一個檔案描述符。
    檔案I/O:
    open() read() write() lseek()修改讀寫位置 close()
    O_RDONLY 只讀 O_WRONLY 只寫 O_RDWR 讀寫 O_CREAT 建立並開啟 O_APPEND 追加

七、程式管理

  1. 掌握 Linux 系統程式屬性和處理機制
    計算機採用多道程式設計:計算機允許多個相互獨立的程式同時進入記憶體,在核心管理控制之下相互穿插的執行
    程式的屬性儲存在一個PCB中,核心為每個程式維護了一個PCB,用於管理相應程式的屬性資訊
    PCB包括 程式控制符 程式組 程式環境 程式執行狀態
    程式狀態:初始態 就緒態 執行態 睡眠態 終止態

  2. 建立程式 — 讀時共享,寫時複製
    在fork後,建立的子程式可訪問父程式的資料空間,若子程式對這些資料修改,則核心會把這些修改資料複製到子程式的地址空間
    exec函式族中的函式可以根據指定的檔名或路徑找到可執行檔案,用該檔案取代呼叫該函式的程式中的程式,再從檔案的main函式開始,執行檔案的內容
    execl execlp execle execv execvp execve 所有的引數最後必須以NULL結尾

程式退出
_exit()無條件的停止
exit()對_exit()進行了包裝,執行前檢查了檔案開啟情況,將緩衝區內容寫入
殭屍程式 呼叫exit後,該程式不會馬上退出,而是會留下一個殭屍程式的資料結構,記載程式的退出狀態,供父程式收集
可以通過wait waitpid有效的防止殭屍程式的產生,對於記憶體中已經有的,可以殺死其父程式,使得其被init接受,init不斷呼叫wait來獲取子程式狀態

  1. 實現同步
    wait(int *status) 使用wait的程式會被掛起,直到捕獲到子程式的退出資訊 status儲存子程式退出狀態
    waitpid(pid ststus) pid>0 等待該pid的程式結束
    -1 與wait相同,等待一個子程式
    0 等待索引所有子程式
    <-1 等待指定程式組|pid|中的子程式

  2. 程式管理命令
    ps 可以檢視系統當前正在執行的程式 -r只列出正在執行的程式
    top 可以實時觀察系統整體執行情況
    pstree 以樹狀圖形式顯示系統程式
    pgrep 根據程式名,從近處佇列中查詢程式,查詢成功後顯示pid
    mice -n 設定程式的優先順序
    jobs 可以檢視作業列表和作業狀態 顯示作業編號,狀態,啟動作業的命令

八、訊號

  1. 訊號分類與產生方式
    1-31 常規訊號 34-64 實時訊號
    訊號來源: 組合按鍵
    系統檢查硬體異常
    滿足某種軟體條件 alarm計時器結束
    系統呼叫kill raise abort
    終端kill
    訊號處理三種方式:忽略SIG_IGN 但SIG_KILL SIGSTOP不可被忽略
    捕捉
    執行預設動作SIG_DFL

  2. 系統呼叫產生程式
    kill(pid sig) 給pid 傳送訊號
    abort 傳送一次終止訊號SIGABRT,終止程式生成core檔案
    pause 程式主動掛起,等待訊號喚醒
    alarm 計時器 指定描述後傳送訊號

  3. 訊號捕獲
    signal(訊號編號 處理) signal(SIGALRM,sigalrm_fn);
    sigacton結構體

九、程式通訊

  1. 程式通訊
    管道通訊:實質是核心管理的緩衝區
    程式中建立的是匿名管道 — 有親緣的程式通訊
    int pipe(int pipefd[2]); 成功:0;失敗:-1,設定errno
    int fd[2]; int status = pipe(fd);
    函式呼叫成功返回r/w兩個檔案描述符。無需open,但需手動close。規定:fd[0] → r; fd[1] → w,就像0對應標準輸入,1對應標準輸出一樣。向管道檔案讀寫資料其實是在讀寫核心緩衝區 close(fd[1]); // 關閉寫的通道
    匿名管道利用fork機制建立聯絡,剛建立的管道讀寫兩端都連結在一個程式上,當程式中呼叫fork後,父子程式共享檔案描述符,所有子程式擁有和父程式相同的管道,有兩個指向管道檔案的檔案描述符,實現通訊實質是關閉多個程式中多餘的檔案描述符,只為待通訊的程式各自保留讀端或寫端
    讀取資料沒有時會被阻塞

命名管道 – 檔案 程式退出後任然存在
命名管道和系統中的一個路徑名關聯int ret=mkfifo(PATH_NAME,S_IFIFO|0666);
S_IFIFO 即表示有名管道檔案

訊號量
semget(key3,2,IPC_CREAT | 0666) 建立訊號量
訊息佇列
可以實現無親緣關係的程式通訊
msgget()建立
int msgget(key_t key, int msgflg); 例:msgget(key,IPC_CREAT|0666)
msgflg:訊息佇列的建立標誌和存取許可權。IPC_CREAT如果核心中沒有此佇列,則建立它。
msgsnd() 像訊息佇列發訊息 msgrev() 從訊息佇列中讀取資訊,讀取的資訊消失
msgctl(msgid1,IPC_RMID,NULL) 刪除
共享記憶體
共享記憶體就是允許兩個不相關的程式訪問同一個邏輯記憶體。共享記憶體是在兩個正在執行的程式之間共享和傳遞資料的一種非常有效的方式。不同程式之間共享的記憶體通常安排為同一段實體記憶體。程式可以將同一段共享記憶體連線到它們自己的地址空間中,所有程式都可以訪問共享記憶體中的地址,就好像它們是由用C語言函式malloc分配的記憶體一樣。而如果某個程式向共享記憶體寫入資料,所做的改動將立即影響到可以訪問同一段共享記憶體的任何其他程式。
建立共享記憶體shmget(key_n,1024,0666|IPC_CREAT))==-1
shmat函式的作用就是用來啟動對該共享記憶體的訪問,並把共享記憶體連線到當前程式的地址空間,shmat(shm_id,0,0)
刪除shmctl(shm_id,IPC_RMID,0)
socket通訊

標頭檔案

#include<sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include<sys/stat.h> 
#include <sys/wait.h>

其他

virtual box三種網路模式
橋接模式就是將主機網路卡與虛擬機器虛擬的網路卡利用虛擬網橋進行通訊
NAT模式藉助虛擬NAT裝置和虛擬DHCP伺服器,使得虛擬機器可以聯網
Host-Only模式將虛擬機器與外網隔開,使得虛擬機器成為一個獨立的系統,只與主機相互通訊

相關文章