LV.2 Linux C语言高级
?
D1 軟件包管理及shell命令
環(huán)境安裝
裝虛擬機(jī)需要將宿主機(jī)的虛擬化功能打開。
重啟電腦。
Linux介紹
1969年,由KenThompson在AT&T貝爾實驗室實現(xiàn)的。使用的是用匯編語言。
1970年,KenThompson(肯·湯普遜)和DennisRitchie(丹尼斯·里奇)使用 C語言對整個系統(tǒng)進(jìn)行了再加工和編寫,使得Unix能夠很容易的移植到其他硬件的計算機(jī)上。
Unix家庭樹
什么是Linux?
GNU&GPL 參考1 參考2
Linux確實存在,許多人都在使用它,但它僅僅是所用系統(tǒng)的一部分。Linux是內(nèi)核:它是為你運行的其他程序分配計算機(jī)資源的程序。內(nèi)核是操作系統(tǒng)的基本部分,但是它自己并無用處;它只能在完整的操作系統(tǒng)框架下才能發(fā)揮作用。Linux一般和GNU操作系統(tǒng)一起使用:整個系統(tǒng)基本上就是GNU加上Linux,或叫GNU/Linux。所有被叫做“Linux”的發(fā)行版實際上是GNU/Linux發(fā)行版。
GNU = GNU is Not Unix
由Richard Stallman(理查德·斯托曼)在1984創(chuàng)建
最初的軟件:gcc、make、glibc…
GPL = General Public License (自由軟件保護(hù)條款)
What is Copyleft? - GNU Project - Free Software Foundation(自由軟件基金會)
學(xué)習(xí)用Ubuntu(每年4月份10月份發(fā)行一次)下載Ubuntu桌面系統(tǒng) | Ubuntu
Linux發(fā)行版本
脫穎而出的Ubuntu
Ubuntu發(fā)行版本代號
體系結(jié)構(gòu)
目前,在桌面環(huán)境下的命令終端仿真器程序有很多,它們各有特色,都擁有各自的用戶群。目前流行的終端窗口有:
Xterm、
Gnome-terminal、
Konsole、
Rxvt等
Ubuntu Linux默認(rèn)安裝的命令終端有Gnome-terminal、Xterm,其他的命令終端都需要另行安裝。
Gnome-terminal是GNOME默認(rèn)的命令終端。比Xterm具有更多、更強(qiáng)的功能,提供了剪切、粘貼、多標(biāo)簽顯示,以及設(shè)置終端配置文件等功能,中文支持和用戶界面也很友好。用戶可以使用窗口菜單,或快捷鍵完成操作。
deb軟件包管理機(jī)制
流行的兩種軟件包管理機(jī)制
Debian Linux(一種自由操作系統(tǒng))首先提出軟件包”的管理機(jī)制,Deb軟件包;Redhat Linux(紅帽)由此提出了 Rpm 軟件包
將應(yīng)用程序的二進(jìn)制文件、配置文檔、man/info幫助頁面等文件合并打包在一個文件中,用戶使用軟件包管理器直接操作軟件包,完成獲取、安裝、卸載、查詢等操作。隨著Linux操作系統(tǒng)規(guī)模的不斷擴(kuò)大,系統(tǒng)中軟件包間復(fù)雜的依賴關(guān)系,導(dǎo)致Linux用戶麻煩不斷。
隨著Linux操作系統(tǒng)規(guī)模的不斷擴(kuò)大,系統(tǒng)中軟件包間復(fù)雜的依賴關(guān)系,導(dǎo)致Linux用戶麻煩不斷。
Debian Linux開發(fā)出了APT(Advanced Packaging Tool)軟件包管理器。
檢查和修復(fù)軟件包依賴關(guān)系
利用Internet網(wǎng)絡(luò)幫助用戶主動獲取軟件包
APT工具再次促進(jìn)了Deb軟件包更為廣泛地使用,成為Debian Linux的一個無法替代的亮點。
軟件包的類型
Ubuntu有兩種類型的軟件包:二進(jìn)制軟件包(deb)和源碼包(deb-src)
二進(jìn)制軟件包(Binary Packages):它包含可執(zhí)行文件、庫文件、配置文件、man/info頁面、版權(quán)聲明和其它文檔。
源碼包(Source Packages):包含軟件源代碼、版本修改說明、構(gòu)建指令以及編譯工具等。先由tar工具歸檔為.tar.gz文件,然后再打包成.dsc文件。
在用戶不確定一個軟件包類型時,可以使用file命令查看文件類型。
軟件包的命名
dpkg(Debian Package”的簡寫)命令
軟件包管理工具分類
根據(jù)用戶交互方式的不同,可以將常見的軟件包管理工具分為三類。
命令行軟件包管理工具(dpkg):
dpkg -i 安裝一個在本地文件系統(tǒng)上存在的Debian軟件包
dpkg -r 移除一個已經(jīng)安裝的軟件包
dpkg -P 移除已安裝軟件包及配置文件
dpkg -L 列出安裝的軟件包清單
dpkg -s 顯出軟件包的安裝狀態(tài)
文本窗口軟件包管理工具:
aptitude為一個高級包管理工具,也是目前首選的字符界面 APT前端。
一旦開始使用,最好一直使用它。否則將失去其包存放的軟件安裝清單,就不能享受自動刪除多余軟件包的功能
aptitude工具也可以在命令行操作
aptitude update 更新可用的包列表
aptitude upgrade 升級可用的包
aptitude dist-upgrade 將系統(tǒng)升級到新的發(fā)行版
aptitude install pkgname 安裝包
aptitude remove pkgname 刪除包
aptitude purge pkgname 刪除包及其配置文件
aptitude search string 搜索包
aptitude show pkgname 顯示包的詳細(xì)信息
aptitude clean 刪除下載的包文件
aptitude autoclean 僅刪除過期的包文件
圖形界面軟件包管理工具(synaptic ):
APT 工作原理
Ubuntu采用集中式的軟件倉庫機(jī)制,將各式各樣的軟件包分門別類地存放在軟件倉庫中,進(jìn)行有效地組織和管理。然后,將軟件倉庫置于許許多多的鏡像服務(wù)器中,并保持基本一致。因此,對于用戶,這些鏡像服務(wù)器就是他們的軟件源(reposity)。
在Ubuntu系統(tǒng)中,使用軟件源配置文件/etc/apt/sources.list 列出最合適訪問的鏡像站點地址。 軟件源配置文件只是告知Ubuntu系統(tǒng)可以訪問的鏡像站點地址。但那些鏡像站點都擁有什么軟件資源并不清楚。若是每安裝一個軟件包,就在服務(wù)器上尋找一邊,效率是很低的。因而,就有必要為這些軟件資源列個清單(建立索引文件),以便本地主機(jī)查詢。這就是APT軟件包管理器的工作原理。
軟件源配置文件
/etc/apt/sources.list。本質(zhì)就是一個普通的文本文件,可以在超級管理員授權(quán)下,使用任何文本編輯器進(jìn)行編輯。在該文件中,添加的軟件源鏡像站點稱為一個配置項,并遵循以下格式:
軟件源
根據(jù)軟件包的開發(fā)組織對該軟件的支持程度,以及遵從的開源程度,劃分為如下四類:
核心(Main):官方維護(hù)的開源軟件,是由Ubuntu官方完全支持的軟件,包括大多數(shù)流行的、穩(wěn)定的開源軟件,是Ubuntu默認(rèn)安裝的基本軟件包;
公共(Universe):社區(qū)維護(hù)的開源軟件,是由Ubuntu社區(qū)的計算機(jī)愛好者維護(hù)的軟件。這些軟件包沒有安全升級的保障。用戶在使用時,需要考慮這些軟件包存在的不穩(wěn)定性;
受限(Restricted):官方維護(hù)的非開源軟件,是專供特殊用途,而且沒有自由軟件版權(quán),不能直接修改軟件,但依然被Ubuntu團(tuán)隊支持的軟件;
多元化(Multiverse):非Ubuntu官方維護(hù)的非開源軟件,用戶使用這些軟件包時,需要特別注意版權(quán)問題。
刷新軟件源
修改了配置文件——/etc/apt/sources.list,目的只是告知軟件源鏡像站點的地址。但那些所指向的鏡像站點所具有的軟件資源并不清楚,需要將這些資源列個清單,以便本地主機(jī)知曉可以申請哪些資源。
使用“apt-get update”命令會掃描每一個軟件源服務(wù)器,并為該服務(wù)器所具有軟件包資源建立索引文件,存放在本地的/var/lib/apt/lists/目錄中。
dpkg和apt軟件包管理器有什么區(qū)別?
dpkg 在命令行模式下完成軟件包管理任務(wù)。為完成軟件包的獲取、查詢、軟件包依賴性檢查、安裝、卸載等任務(wù),需要使用各自不同的命令Debian Linux開發(fā)出了APT軟件包管理器。 用于,檢查和修復(fù)軟件包依賴關(guān)系 ,利用Internet網(wǎng)絡(luò)幫助用戶主動獲取軟件包管理軟件包
在Ubuntu Linux中,通常使用apt-get命令管理軟件包,只需告知軟件包名字,就可以自動完成軟件包的獲取、安裝、編譯和卸載,以及檢查軟件包依賴關(guān)系。 apt-get命令提供了一個軟件包管理的命令行平臺。在這個平臺上使用更豐富的子命令,完成具體的管理任務(wù)。apt-get subcommands(子命令) [ -d | -f | -m | -q | --purge | --reinstall | - b | - s | - y | - u | - h | -v ] (選項) pkg
修復(fù)軟件包依賴關(guān)系
如果由于故障而中斷軟件安裝過程,可能會造成關(guān)聯(lián)的軟件包只有部分安裝。之后,用戶就會發(fā)現(xiàn)該軟件既不能重裝又不能刪除。
作為組合命令,下面前者用于檢查軟件包依賴關(guān)系,后者用于修復(fù)依賴關(guān)系。
“apt-get check”——“apt-get -f install”
在處理依賴關(guān)系上,apt-get會自動下載并安裝具有依賴關(guān)系(depends)的軟件包,但不會處理與安裝軟件包存在推薦(recommends)和建議(suggests)關(guān)系的軟件包。
更新軟件包
在Ubuntu Linux中,只需使用命令“apt-get upgrade”就可以輕松地將系統(tǒng)中的所有軟件包一次性升級到最新版本安裝軟件包
在準(zhǔn)備好軟件源并連通網(wǎng)絡(luò)后,用戶只需告知安裝軟件的名稱,“apt-get install”命令就可以輕松完成整個安裝過程,而無須考慮軟件包的版本、優(yōu)先級、依賴關(guān)系等。使用“apt-get install”下載軟件包大體分為四步:STEP1,掃描本地存放的軟件包更新列表(由apt-get update命令刷新更新列表),找到最新版本的軟件包;STEP2,進(jìn)行軟件包依賴關(guān)系檢查,找到支持該軟件正常運行的所有軟件包;STEP3,從軟件源所指的鏡像站點中,下載相關(guān)軟件包;STEP4 ,解壓軟件包,并自動完成應(yīng)用程序的安裝和配置。重新安裝軟件包
當(dāng)用戶不小心損壞了已安裝的軟件包,而需要修復(fù)。或者,希望重新安裝軟件包中某些文件的最新版本,可以重新安裝軟件包。卸載軟件包
不完全卸載 “apt-get remove”會關(guān)注那些與被刪除的軟件包相關(guān)的其它軟件包,刪除一個軟件包時,將會連帶刪除與該軟件包有依賴關(guān)系的軟件包。完全卸載 “apt-get --purge remove”命令在卸載軟件包文件的同時,還刪除該軟件包所使用的配置文件。清理軟件包緩沖區(qū)
清理軟件包緩沖區(qū).如果用戶認(rèn)為軟件包緩沖區(qū)中的文件沒有任何價值了,有必要刪除全部下載的軟件包。可以使用“apt-get clean”清理整個軟件包緩沖區(qū),除了lock鎖文件和partial目錄。
按照依賴關(guān)系清理緩沖區(qū)中多余的軟件包 如果用戶希望緩沖區(qū)中只保留最新版本的軟件包,多余版本全部清除,可以使用“apt-get autoclean”命令。
查詢軟件包描述信息
使用“apt-cache show”命令獲取指定軟件包的詳細(xì)信息,包括軟件包安裝狀態(tài)、優(yōu)先級、適用架構(gòu)、版本、存在依賴關(guān)系的軟件包,以及功能描述。該命令可以同時顯現(xiàn)多個軟件包的詳細(xì)信息。
獲取軟件包安裝狀態(tài)
使用“apt-cache policy”可以獲取軟件包當(dāng)前的安裝狀態(tài)如果用戶僅想了解某個軟件包依賴于哪些軟件包,可以使用“apt-cache depends”命令如果用戶僅想了解某個軟件包被哪些軟件包所依賴,可以使用“apt-cache rdepends”命令。總結(jié)與思考
本節(jié)課主要講解了APT軟件包管理器的工作原理及主要命令。
下列文件什么作用?
/etc/apt/sources.list
/var/lib/apt/lists/*
/var/cache/apt/archives
shell基本命令
shell簡介
shll 直譯為貝殼 ,Linux內(nèi)核的一個外層保護(hù)工具,完成用戶與內(nèi)核之間的交互。將用戶的命令或按鍵轉(zhuǎn)化程序內(nèi)核所能夠理解的指令,控制操作系統(tǒng)做出響應(yīng),直到控制相關(guān)硬件設(shè)備。然后,將輸出結(jié)果通過shell提交給用戶。
命令是用戶向系統(tǒng)內(nèi)核發(fā)出控制請求,與之交互的文本流。
shell是一個命令行解釋器,將用戶命令解析為操作系統(tǒng)所能理解的指令,實現(xiàn)用戶與操作系統(tǒng)的交互。
當(dāng)需要重復(fù)執(zhí)行若干命令,可以將這些命令集合起來,加入一定的控制語句,編輯成為shell腳本文件,交給shell批量執(zhí)行。
用戶在命令行提示符下鍵入命令文本,開始與Shell進(jìn)行交互
接著,shell將用戶的命令或按鍵轉(zhuǎn)化成內(nèi)核所能夠理解的指令
控制操作系統(tǒng)做出響應(yīng),直到控制相關(guān)硬件設(shè)備
然后,shell將輸出結(jié)果通過shell提交給用戶
選擇shell
最初的UNIX shell經(jīng)過多年的發(fā)展,由不同的機(jī)構(gòu)、針對不同的目的,開發(fā)出許多不同類型的shell程序。目前流行的shell主要有幾種 :
- Bourne(/b??n/ 小溪) Shell(簡稱sh):它是Unix的第一個shell程序,早已成為工業(yè)標(biāo)準(zhǔn)。目前幾乎所有的Linux系統(tǒng)都支持它。不過Bourne Shell的作業(yè)控制功能薄弱,且不支持別名與歷史記錄等功能。
- C Shell(簡稱csh)
- Korn Shell(簡稱ksh)
- Bourne Again Shell(簡稱bash):能夠提供環(huán)境變量以配置用戶Shell環(huán)境,支持歷史記錄,內(nèi)置算術(shù)功能,支持通配符表達(dá)式,將常用命令內(nèi)置簡化。
體驗shell命令的樂趣
立即關(guān)機(jī)與重啟
使用系統(tǒng)中的圖形界面
使用shell命令
在命令行鍵入以上命令,系統(tǒng)立即關(guān)機(jī) :
在命令行鍵入以上命令,系統(tǒng)立即重新啟動 :
定時關(guān)機(jī)sudo shutdown -h +45 “this is all,game over.” 時間限定在45分鐘內(nèi),否則計算機(jī)將自動關(guān)機(jī)
定時重啟sudo shutdown -r +60 計算機(jī)會在60分鐘后自動重啟
shell命令格式
shell提示符標(biāo)識了命令行的開始。用戶在提示符后面輸入一條命令并按Enter鍵,完成向系統(tǒng)提交指令。
通常shell命令提示符采用以下的格式:
username:用戶名,顯示當(dāng)前登錄用戶的賬戶
hostname:主機(jī)名,顯示登錄的主機(jī)名,例如若遠(yuǎn) 程登錄后,則顯示登錄的主機(jī)名;
direction:目錄名,顯示當(dāng)前所處的路徑,當(dāng)在根目錄下顯示為“/”,當(dāng)在用戶主目錄下顯示為“~”;
通常一條命令包含三個要素:命令名稱、選項、參數(shù)。命令名稱是必須的,選項和參數(shù)都可能是可選項。命令格式如下所示:
KaTeX parse error: Expected 'EOF', got '#' at position 28: …當(dāng)前用戶為超級用戶,提示符為“#?”,其他用戶的提示符均為“”;
Command:命令名稱,Shell命令或程序,嚴(yán)格區(qū)分大小寫
Options:命令選項,用于改變命令執(zhí)行動作的類型,由“-”引導(dǎo),可以同時帶有多個選項;
Argument:命令參數(shù),指出命令作用的對象或目標(biāo),有的命令允許帶多個參數(shù)。
通常一條命令包含三個要素:命令名稱、選項、參數(shù)。命令名稱是必須的,選項和參數(shù)都可能是可選項。命令格式如下所示:
KaTeX parse error: Expected 'EOF', got '#' at position 28: …當(dāng)前用戶為超級用戶,提示符為“#?”,其他用戶的提示符均為“”;
Command:命令名稱,Shell命令或程序,嚴(yán)格區(qū)分大小寫
Options:命令選項,用于改變命令執(zhí)行動作的類型,由“-”引導(dǎo),可以同時帶有多個選項;
Argument:命令參數(shù),指出命令作用的對象或目標(biāo),有的命令允許帶多個參數(shù)。
一條命令的三要素中間用空格隔開
多行命令用 ‘;’ 分隔。
同一行命令換行結(jié)尾加 ‘\’ 聲明未結(jié)束。
不帶選項和參數(shù)
ls命令未帶任何參數(shù),列出當(dāng)前目錄中的所有文件,只顯示文件名稱。
命令不帶選項或參數(shù),通常意為使用默認(rèn)選項或參數(shù)。
命令行操作
bash(Bourne Again Shell,簡稱bash)除了在命令編輯功能上比sh有很大改進(jìn)外,還增加了特有功能極大地方便了用戶在Shell命令行上的操作。
補齊命令與文件名 :按兩下TAB或ESC鍵,用戶命令補全, 按一次TAB用于文件名補全。
查詢命令歷史 : history
總結(jié)與思考
本節(jié)課先對shell做了基本介紹,然后講解了linux命令的基本格式,最后介紹了常見的命令行操作
思考:
什么是shell?
如何更改歷史記錄容量?
歷史記錄如何刪除?
shell中的特殊字符
通配符
當(dāng)需要用命令處理一組文件,例如file1.txt、file2.txt、file3.txt……,用戶不必一一輸入文件名,可以使用shell通配符。shell命令的通配符含義如下表
管道
管道可以把一系列命令連接起來,意味著第一個命令的輸出將作為第二個命令的輸入,通過管道傳遞給第二個命令,第二個命令的輸出又將作為第三個命令的輸入,以此類推。就像通過使用“|”符連成了一個管道。
以上操作中,借助管道“|”,將ls的輸出直接作為wc命令的輸入。使用管道可以巧妙的將一些命令聯(lián)合使用,得到單個命令所無法實現(xiàn)的效果。例如使用以上的命令組合,得到的是/usr/bin目錄下文件的個數(shù)。
grep -rn “Linux” /etc/passwd | wc -w 查看文件行數(shù)
總結(jié)與思考
本節(jié)課主要介紹了shell中的幾種特殊字符的用法以及管道的使用
思考
shell中有哪些特殊字符?
shell中管道的作用?
shell中g(shù)rep命令和管道如何結(jié)合?
輸入/輸出重定向
輸入/輸出重定向是改變shell命令或程序默認(rèn)的標(biāo)準(zhǔn)輸入/輸出目標(biāo),重新定向到新的目標(biāo)。
linux中默認(rèn)的標(biāo)準(zhǔn)輸入定義為鍵盤,標(biāo)準(zhǔn)輸出定義為終端窗口。
用戶可以為當(dāng)前操作改變輸入或輸出,迫使某個特定命令的輸入或輸出來源為外部文件。
cat命令功能為在標(biāo)準(zhǔn)輸出上顯示文件。下面通過一個實例,可以更好地理解重定向的功能。
命令置換
命令替換是將一個命令的輸出作為另一個命令的參數(shù)。命令格式如下所示。
其中,命令command2的輸出將作為命令command1的參數(shù)。需要注意,命令置換的單引號為ESC鍵下方的“`”鍵
pwd命令用于顯示當(dāng)前目錄的絕對路徑。在上面的命令行中,使用命令置換符,將pwd的運行結(jié)果作為ls命令的參數(shù)。最終,命令執(zhí)行結(jié)果是顯示當(dāng)前目錄的文件內(nèi)容。
總結(jié)與思考
本節(jié)課首先介紹了shell中的輸入輸出重定向的用法,然后介紹了命令置換的 使用
思考:
什么叫輸入輸出重定向?
有哪些輸入輸出重定向符?
D2 linux shell命令
2.1shell基本系統(tǒng)維護(hù)命令
獲取聯(lián)機(jī)幫助
man 可以找到特定的聯(lián)機(jī)幫助頁,man ls 。聯(lián)機(jī)幫助頁提供了指定命令commandname的相關(guān)信息,包括:名稱、函數(shù)、語法以及可選參數(shù)描述等。無論幫助有多長,都遵循這個格式顯示。在頁面很多的情況下使用PageUp和PageDown鍵翻頁。最后,使用“:q”退出幫助頁面。
NAME:命令的名稱 SYNOPSIS:命令的語法格式 DESCRIPTION:命令的一般描述以及用途 OPTIONS:描述命令所有的參數(shù)或選項 SEE ALSO:列出聯(lián)機(jī)幫助頁中與該命令直接相關(guān)或功能相近的其他命令 BUGS:解釋命令或其輸出中存在的任何已知的問題或缺陷 EXAMPLES:普通的用法示例 AUTHORS:聯(lián)機(jī)幫助頁以及命令的作者基本系統(tǒng)維護(hù)命令
passwd 修改當(dāng)前用戶的口令,sudo passwd
出于系統(tǒng)安全考慮,Linux系統(tǒng)中的每一個帳號都必須同時具備用戶名和密碼。 可以使用passwd命令,為已有賬戶重新修改用戶口令。 需要說明的是,超級用戶root可以修改所有其他用戶的口令,而普通用戶只能修改自己的用戶口令,如果確要修改超級用戶或其他用戶口令的話,需要具有超級用戶的權(quán)限 passwd命令的一般語法格式為:
單獨使用passwd命令,意為修改當(dāng)前用戶自己的口令。下面命令實例用于修改用戶自己的口令。
su
單獨使用su命令,默認(rèn)為要轉(zhuǎn)換為超級用戶root。
su命令用于臨時改變用戶身份,具有其他用戶的權(quán)限。普通用戶可以使用su命令臨時具有超級用戶的權(quán)限;超級用戶也可以使用普通用戶身份完成一些操作。當(dāng)需要放棄當(dāng)前用戶身份,可以使用exit命令切換回來。su命令的一般語法格式為:
選項“-c”表示執(zhí)行一個命令后就結(jié)束;-m表示仍保留環(huán)境變量不變;-表示轉(zhuǎn)換用戶身份時,同時使用該用戶的環(huán)境。
echo
echo命令用于在標(biāo)準(zhǔn)輸出——顯示器上顯示一段文字,一般起到提示作用。echo命令的一般語法格式為:
選項-n表示輸出文字后不換行。提示信息字符串可以加引號,也可以不加。
date
date命令用于顯示和設(shè)置系統(tǒng)日期和時間。date命令的一般語法格式為:
選項-s表示按照datestr日期顯示格式設(shè)置日期;單獨使用date命令,用于顯示系統(tǒng)時鐘中當(dāng)前日期。時間的格式為:“hh:mm:ss”,日期格式為:“mm/dd/yy”。
clear 清屏 ctrl + l
df
df命令用于查看磁盤空間的使用情況。查看磁盤空間是用戶應(yīng)當(dāng)經(jīng)常做的事情,因為誰也不希望看到根或/var分區(qū)在不經(jīng)意間填滿,以便及時清理。df命令的一般格式為:
其中,參數(shù)Filesystem表示物理文件系統(tǒng)。各選項的含義如表所示。
從以下命令的執(zhí)行結(jié)果可以看到,這臺計算機(jī)只有一塊硬盤(/dev/sda1),文件格式類型為Ext3,已經(jīng)使用36%的存儲空間。同時,可以發(fā)現(xiàn)計算機(jī)上還安裝了CD-ROM(/dev/hdc)、USB存儲器(/dev/sdb1)。其他分區(qū)均為專用的虛擬文件系統(tǒng)
df 命令常用參數(shù):
-a :列出所有文件系統(tǒng)
-k :列出磁盤的分配情況(KB)
-h :同-k, 但大小以G、M,K單位顯示
-l :僅列出本地文件系統(tǒng)
例:
#df -h
du
列出目錄和文件使用的磁盤塊。出目錄和文件所使用的磁盤塊數(shù),每塊占512個字節(jié)。
???????常用參數(shù):
-a :僅列出空閑的文件數(shù)
-h :列出磁盤的使用情況(KB)
-s :列出總的空閑空間(KB)
例: #du –h /etc???????
2.2用戶管理
/ etc :etc是Etcetera的縮寫,是“等等”的意思,用于存放所有系統(tǒng)管理所需要的配置文件和子目錄,基本上硬件和軟件配置文件都在此目
用戶管理
用戶的屬性
用戶名
口令
用戶ID(UID)
用戶主目錄(HOME)
用戶shell
/etc/passwd文件
/etc/passwd文件是系統(tǒng)能夠識別的用戶清單。用戶登陸時,系統(tǒng)查詢這個文件,確定用戶的UID并驗證用戶口令
登陸名
經(jīng)過加密的口令
UID
默認(rèn)的GID
個人信息
主目錄
登陸shell
/etc/group文件
包含了UNIX組的名稱和每個組中成員列表,每一行代表一個組,包括四個字段,組名、加密的口令、GID號、成員列表,彼此用逗號隔開。
group文件實例
添加用戶
adduser
語法:adduser
實例:
# adduser newuser
添加用戶名為newuser的新用戶
adduser配置文件
/etc/adduser.conf
FIRST_UID=1000
LAST_UID=29999
USERS_GID=100
DHOME=/home
DSHELL=/bin/bash
SKEL=/etc/skel
SKEL模板
/etc/skel目錄是被 /usr/sbin/useradd使用
把想要新用戶擁有的配置文件從/etc/skel目錄拷貝,常用的文件:
.bash_profile
.bashrc
.bash_logout
.dircolors
.inputrc
.vimrc
添加新用戶的過程
系統(tǒng)
編輯passwd和shadow文件,定義用戶帳號
設(shè)置一個初始口令
創(chuàng)建用戶主目錄,用chown和chmod命令改變主目錄 的屬主和屬性
為用戶所進(jìn)行的步驟
將默認(rèn)的啟動文件復(fù)制到用戶主目錄中
設(shè)置用戶的郵件主目錄并建立郵件別名
2.2用戶管理相關(guān)命令介紹
設(shè)置初始口令
使用passwd命令可以修改用戶口令
root用戶可以修改任何用戶的口令
語法:passwd [-k] [-l] [u] [-f] [-d] [-S] username
使用方法:
passwd username
修改用戶屬性
usermod
語法:usermod [-u uid [-o]] [-g group] [-G gropup,…]
[-d home [-m]] [-s shell] [-c comment]
[-l new_name] [-f inactive][-e expire]
[-p passwd] [-L|-U] name
舉例用戶oldname改名為newname,注意要同時更改家目錄:
usermod –d /home/newname –m –l newname oldname
刪除用戶
deluser
語法: deluser
使用方法:
deluser --remove-home user1
刪除用戶user1的同時刪除用戶的工作目錄
添加用戶組
addgroup
語法: addgroup groupname
使用方法:
addgroup groupname
刪除用戶組
delgroup
語法: delgroup groupname
使用方法:
delgroup groupname1
總結(jié)與思考
本節(jié)課主要介紹了linux系統(tǒng)中用戶管理相關(guān)的重要配置文件以及用戶管理相關(guān)的命令。
思考
用戶相關(guān)的文件有哪些?
簡述添加用戶的過程。
2.3進(jìn)程管理的相關(guān)命令
進(jìn)程的概念
程序的一次執(zhí)行就是一個進(jìn)程
使用命令查看進(jìn)程
ps 命令
顯示進(jìn)程 (process) 的動態(tài)
語法:
ps [options]
ps命令基本選項及參數(shù)釋義
a:顯示現(xiàn)行終端機(jī)下的所有程序,包括其他用戶的程序。
c:列出程序時,顯示每個程序真正的指令名稱,而不包含路徑,選項或常駐服務(wù)的標(biāo)示。
e:列出程序時,顯示每個程序所使用的環(huán)境變量。
f:用ASCII字符顯示樹狀結(jié)構(gòu),表達(dá)程序間的相互關(guān)系。
g:顯示現(xiàn)行終端機(jī)下的所有程序,包括群組領(lǐng)導(dǎo)者的程序。
h:不顯示標(biāo)題列。
u:以用戶為主的格式來顯示程序狀況。
x:顯示所有程序,不以終端機(jī)來區(qū)分。
r:只列出現(xiàn)行終端機(jī)正在執(zhí)行中的程序。
v:采用虛擬內(nèi)存的格式顯示程序狀況
-a:顯示所有終端機(jī)下執(zhí)行的程序,除了階段作業(yè)領(lǐng)導(dǎo)者之外。
-c:顯示CLS和PRI欄位。
-d:顯示所有程序,但不包括階段作業(yè)領(lǐng)導(dǎo)者的程序。
-e:顯示所有程序。
-f:顯示UID,PPIP,C與STIME欄位。
-H:顯示樹狀結(jié)構(gòu),表示程序間的相互關(guān)系。
-u<用戶識別碼>:列出屬于該用戶的程序的狀況,也可使用用戶名稱來指定。
-j:采用工作控制的格式顯示程序狀況
-l或l:采用詳細(xì)的格式來顯示程序狀況。
常見的用法:
ps -elf 普通使用的標(biāo)準(zhǔn)
ps -aux BSD 使用的標(biāo)準(zhǔn)
進(jìn)程的狀態(tài)標(biāo)志
D: 不可中斷的靜止
R: 正在執(zhí)行中
S: 阻塞狀態(tài)
T: 暫停執(zhí)行
Z: 不存在但暫時無法消除
<: 高優(yōu)先級的進(jìn)程
N: 低優(yōu)先級的進(jìn)程
L: 有內(nèi)存分頁分配并鎖在內(nèi)存中
top命令
監(jiān)視進(jìn)程
通常會全屏顯示,而且會隨著進(jìn)程狀態(tài)的變化不斷更新
整個系統(tǒng)的信息也會顯示,為查找問題提供了便利
可以顯示系統(tǒng)總共有多少CPU和內(nèi)存資源以及負(fù)載平衡等信息。
top 實時檢測進(jìn)程 q退出
pstree命令
將所有行程以樹狀圖顯示, 樹狀圖將會以 pid (如果有指定) 或是以init這個基本進(jìn)程為根,如果有指定使用者id, 則樹狀圖會只顯示該使用者所擁有的進(jìn)程。
參數(shù):
-a 顯示該進(jìn)程的完整指令及參數(shù), 如果是被記憶體置換出去的進(jìn)程則會加上括號
-c 如果有重覆的進(jìn)程名, 則分開列出
cd /proc/ 常用查看進(jìn)程信息命令
終止進(jìn)程
使用kill命令終止進(jìn)程
kill [-signal] PID
signal是信號,PID是進(jìn)程號
kill 命令向指定的進(jìn)程發(fā)出一個信號signal,在默認(rèn)情況下,kill 命令向指定進(jìn)程發(fā)出信號15,正常情下,將殺死那些不捕捉或不忽略這個信號的進(jìn)程
kill -l 查看信號含義
2.4文件系統(tǒng)的類型和結(jié)構(gòu)
文件系統(tǒng)的類型
Linux文件系統(tǒng)
在任何一個操作系統(tǒng)中,文件系統(tǒng)無疑是其最重要的組件,用于組織和管理計算機(jī)存儲設(shè)備上的大量文件,并提供用戶交互接口。Linux同樣具備完善的文件系統(tǒng)。用戶既可以使用界面友好的Nautilus圖形文件管理器,也可以使用功能強(qiáng)大的shell文件系統(tǒng)管理工具。
文件系統(tǒng)類型
linux是一種兼容性很高的操作系統(tǒng),支持的文件系統(tǒng)格式很多,大體可分以下幾類:
磁盤文件系統(tǒng):指本地主機(jī)中實際可以訪問到的文件系統(tǒng),包括硬盤、CD-ROM、DVD、USB存儲器、磁盤陣列等。常見文件系統(tǒng)格式有:autofs、coda、Ext(Extended File sytem,擴(kuò)展文件系統(tǒng))、Ext3、Ext4、VFAT、ISO9660(通常是CD-ROM)、UFS(Unix File System,Unix文件系統(tǒng))、FAT、FAT16、FAT32、NTFS等;
網(wǎng)絡(luò)文件系統(tǒng):是可以遠(yuǎn)程訪問的文件系統(tǒng),這種文件系統(tǒng)在服務(wù)器端仍是本地的磁盤文件系統(tǒng),客戶機(jī)通過網(wǎng)絡(luò)遠(yuǎn)程訪問數(shù)據(jù)。常見文件系統(tǒng)格式有:NFS、Samba等;
專有/虛擬文件系統(tǒng):不駐留在磁盤上的文件系統(tǒng)。常見格式有:TMPFS(臨時文件系統(tǒng))、PROCFS(Process File System,進(jìn)程文件系統(tǒng))和LOOPBACKFS(Loopback File System,回送文件系統(tǒng))。
目前Ext4是Linux系統(tǒng)廣泛使用的一種文件格式。在Ext3基礎(chǔ)上,對有效性保護(hù)、數(shù)據(jù)完整性、數(shù)據(jù)訪問速度、向下兼容性等方面做了改進(jìn)。
最大特點是日志文件系統(tǒng):可將整個磁盤的寫入動作完整地記錄在磁盤的某個區(qū)域上,以便在必要時回溯追蹤。
查看文件系統(tǒng)的命令
mount\df\file\parted
SCSI與IDE設(shè)備命名
sata硬盤的設(shè)備名稱是“/dev/sda”
/dev/sda1 含義?
/dev/sdb3 含義?
IDE硬盤的設(shè)備名稱是“/dev/hda”
/dev/hdc2 含義?
如果很在意系統(tǒng)的高性能和穩(wěn)定性,應(yīng)該使用SCSI硬盤
cat /proc/partitions
Linux分區(qū)的命名方式
字母和數(shù)字相結(jié)合
前兩個字母表示設(shè)備類型
“hd”代表IDE硬盤
“sd”表示SCSI或SATA硬盤
第三個字母說明具體的設(shè)備
“/dev/hda”表示第一個IDE硬盤
“/dev/hdb”表示第二個IDE硬盤
交換分區(qū)
將內(nèi)存中的內(nèi)容寫入硬盤或從硬盤中讀出,稱為內(nèi)存交換(swapping)
交換分區(qū)最小必須等于計算機(jī)的內(nèi)存
可以創(chuàng)建多于一個的交換分區(qū)
盡量把交換分區(qū)放在硬盤驅(qū)動器的起始位置
Linux文件系統(tǒng)的結(jié)構(gòu)
文件系統(tǒng)邏輯結(jié)構(gòu)
某所大學(xué)的學(xué)生可能在一兩萬人左右,通常將學(xué)生分配在以學(xué)院-系-班為單位的分層組織機(jī)構(gòu)中。若需要查找一名學(xué)生時,最笨的辦法是依次問詢大學(xué)中的每一個學(xué)生,直到找到為止。如果按照從學(xué)院、到系、再到班的層次查詢下去,必然可以找到該學(xué)生,且查詢效率高。這種樹形的分層結(jié)構(gòu)就提供了一種自頂向下的查詢方法。
如果把學(xué)生看作文件,院-系-班的組織結(jié)構(gòu)看作是Linux文件目錄結(jié)構(gòu),那么就同樣可以有效地管理數(shù)量龐大的文件。
一直使用微軟Windows操作系統(tǒng)的用戶似乎已經(jīng)習(xí)慣了將硬盤上的幾個分區(qū),并用A:、B:、C:、D:等符號標(biāo)識。存取文件時一定要清楚存放在哪個磁盤的哪個目錄下。
Linux的文件組織模式猶如一顆倒置的樹,這與Windows文件系統(tǒng)有很大差別。所有存儲設(shè)備作為這顆樹的一個子目錄。存取文件時只需確定目錄就可以了,無需考慮物理存儲位置。
分區(qū)與目錄的關(guān)系
在Windows下,目錄結(jié)構(gòu)屬于分區(qū);在Linux下,分區(qū)屬于目錄結(jié)構(gòu)。
如何知道文件存儲的具體硬件位置呢?
在Linux中,將所有硬件都視為文件來處理,包括硬盤分區(qū)、CD-ROM、軟驅(qū)以及其他USB移動設(shè)備等。為了能夠按照統(tǒng)一的方式和方法訪問文件資源,Linux中提供了對每種硬件設(shè)備相應(yīng)的設(shè)備文件。一旦Linux系統(tǒng)可以訪問到硬件,就將其上的文件系統(tǒng)掛載到目錄樹中的一個子目錄中。
例如,用戶插入USB移動存儲器,Ubuntu Linux自動識別后,將其掛載到“/media/disk”目錄下。而不象Windows系統(tǒng)將USB存儲器作為新驅(qū)動器,表示為“F:”盤。
Linux文件系統(tǒng)就是一個樹形的分層組織結(jié)構(gòu)。將根(/)作為整個文件系統(tǒng)的惟一起點,其他所有目錄都從該點出發(fā)。將Linux的全部文件按照一定的用途歸類,合理地掛載到這顆“大樹”的“樹枝”或“樹葉”上,如圖所示。而這些全不用考慮文件的實際存儲位置,無論是存在硬盤上,還是在CD-ROM或USB存儲器中,甚至是網(wǎng)絡(luò)終端。
基本目錄
由于Linux是完全開源的軟件,各Linux發(fā)行機(jī)構(gòu)都可以按照自己的需求對文件系統(tǒng)進(jìn)行裁剪,所以如此眾多的Linux發(fā)行版本的目錄結(jié)構(gòu)也不盡相同。為了規(guī)范文件目錄命名和存放標(biāo)準(zhǔn),頒發(fā)了文件層次結(jié)構(gòu)標(biāo)準(zhǔn)(FHS,File Hierarchy Standard),2004年發(fā)行版本FHS 2.3。Ubuntu Linux系統(tǒng)同樣也遵循這個標(biāo)準(zhǔn)
絕對路徑和相對路徑
在認(rèn)識到Linux文件系統(tǒng)是樹形分層的組織結(jié)構(gòu),且只有一個根節(jié)點之后。在Linux文件系統(tǒng)中查找一個文件,只要確定文件名和路徑,就可以惟一確定這個文件。例如
“/usr/games/gnect”
絕對路徑:指文件在文件系統(tǒng)中的準(zhǔn)確位置。通常在本地主機(jī)上,以根目錄為起點。例如“/usr/games/gnect”就是絕對路徑。
相對路徑:指相對于用戶當(dāng)前位置的一個文件或目錄的位置。例如,用戶處在usr目錄中時,只需要“games/gnect”就可確定這個文件。
Linux文件系統(tǒng)與Windows文件系統(tǒng)比較
2.5文件系統(tǒng)相關(guān)命令
file、ln命令
file命令
在Linux文件系統(tǒng)中,文件擴(kuò)展名不總是被使用或被一致地使用。如果一個文件沒有擴(kuò)展名,或者文件與其擴(kuò)展名不符時怎么辦呢?file命令功能用于判定一個文件的類型。file命令一般語法格式為:
file [ filename ]
其中filename是文件名。命令的輸出將顯示該文件是二進(jìn)制文件、文本文件、目錄文件、設(shè)備文件,還是Linux中其他類型的文件。
創(chuàng)建鏈接文件
鏈接文件:在文件之間創(chuàng)建鏈接。這種操作實際上是給系統(tǒng)中已有的某個文件指定另外一個可用于訪問它的名稱。
Linux中有兩種類型的鏈接:
硬鏈接是利用Linux中為每個文件分配的物理編號——inode建立鏈接。因此,硬鏈接不能跨越文件系統(tǒng)。
軟鏈接(符號鏈接)是利用文件的路徑名建立鏈接。通常建立軟鏈接使用絕對路徑而不是相對路徑,以最大限度增加可移植性。
需要注意的是,如果是修改硬鏈接的目標(biāo)文件名,鏈接依然有效;如果修改軟鏈接的目標(biāo)文件名,則鏈接將斷開;對一個已存在的鏈接文件執(zhí)行移動或刪除操作,有可能導(dǎo)致鏈接的斷開。假如刪除目標(biāo)文件后,重新創(chuàng)建一個同名文件,軟鏈接將恢復(fù),硬鏈接不再有效,因為文件的inode已經(jīng)改變。
ln命令
命令可以用于創(chuàng)建文件的鏈接文件。ln命令一般語法格式為:
ln [ -s ] target link_name
其中,選項“-s”表示為創(chuàng)建軟鏈接。在缺省情況下,創(chuàng)建硬鏈接。參數(shù)target為目標(biāo)文件,link_name為鏈接文件名。如果鏈接文件名已經(jīng)存在但不是目錄,將不做鏈接。目標(biāo)文件可以是任何一個文件名,也可以是一個目錄。
以上命令為/proc/cpuinfo文件創(chuàng)建了一個軟鏈接文件。使用“l(fā)s –l”命令可以查看到新創(chuàng)建的鏈接文件所指向的目標(biāo)文件名。
文件的歸檔和壓縮
壓縮文件
用戶在進(jìn)行數(shù)據(jù)備份時,需要把若干文件整合為一個文件以便保存。盡管整合為一個文件進(jìn)行管理,但文件大小仍然沒變。若需要網(wǎng)絡(luò)傳輸文件時,就希望將其壓縮成較小的文件,以節(jié)省在網(wǎng)絡(luò)傳輸?shù)臅r間。因此本節(jié)介紹文件的歸檔與壓縮。
文件壓縮和歸檔
歸檔文件是將一組文件或目錄保存在一個文件中。
壓縮文件也是將一組文件或目錄保存一個文件中,并按照某種存儲格式保存在磁盤上,所占磁盤空間比其中所有文件總和要少。
歸檔文件仍是沒有經(jīng)過壓縮的,它所使用的磁盤空間仍等于其所有文件的總和。因而,用戶可以將歸檔文件再進(jìn)行壓縮,使其容量更小。
gzip是Linux中最流行的壓縮工具,具有很好的移植性,可在很多不同架構(gòu)的系統(tǒng)中使用。bzip2在性能上優(yōu)于gzip,提供了最大限度的壓縮比率。如果用戶需要經(jīng)常在Linux和微軟Windows間交換文件,建議使用zip。
目前,歸檔工具使用最廣泛的tar命令,可以把很多文件(甚至磁帶)合并到一個稱為tarfile的文件中,通常文件擴(kuò)展名為.tar。然后,再使用zip、gzip或bzip2等壓縮工具進(jìn)行壓縮。
壓縮文件
shell歸檔和壓縮工具
使用shell歸檔和壓縮工具可以更直接地完成文檔的打包任務(wù)。由于該類shell命令是成對使用的,因此下面按對介紹相關(guān)命令。
gzip與gunzip命令
與zip明顯區(qū)別在于只能壓縮一個文件,無法將多個文件壓縮為一個文件。gzip命令符號模式的一般語法格式為:
其中,filename表示要壓縮的文件名,gzip會自動在這個文件名后添加擴(kuò)展名為.gz,作為壓縮文件的文件名。
gunzip命令符號模式的一般語法格式為:
其中,選項“-f”用于解壓文件時,對覆蓋同名文件不做提示。
在執(zhí)行g(shù)zip命令后,它將刪除舊的未壓縮的文件并只保留已壓縮的版本。以下命令以最大的壓縮率對文件file_1進(jìn)行壓縮,生成file_1.gz文件。使用“-l”選項可以查看壓縮的相關(guān)信息。最后使用gunzip命令對文件進(jìn)行了解壓。與壓縮時相反,file_1.gz文件會被刪除,繼之生成file_1。
tar命令
tar命令主要用于將若干文件或目錄合并為一個文件,以便備份和壓縮。當(dāng)然,之后出現(xiàn)tar程序的改進(jìn)版本,可以實現(xiàn)在合并歸檔的同時進(jìn)行壓縮。tar命令符號模式的一般語法格式為:
第一,將myExamples/目錄下的所有文件全部歸檔,打包到一個文件中myExamples.tar;
第二,將myExamples/目錄下的所有文件全部歸檔,并使用bzip2壓縮成一個文件myExamples.tar.bz;
第三,將myExamples/目錄下的所有文件全部歸檔,并使用gzip壓縮成一個文件myExamples.tar.gz。
如果想查看一下歸檔文件中的詳細(xì)內(nèi)容,使用類似以下命令:
使用以下命令完成tar文件的釋放。其中,“tar -xjf”和“tar –xzf”等效與先解壓縮后釋放tar文件。
Linux 網(wǎng)絡(luò)配置管理
網(wǎng)絡(luò)配置基礎(chǔ)
用戶既可以通過命令行的方式,也可以通過友好的圖形界面,輕松完成網(wǎng)絡(luò)配置。
實現(xiàn)Linux網(wǎng)絡(luò)配置的惟一目標(biāo)就是修改系統(tǒng)中眾多的網(wǎng)絡(luò)配置文件,如/etc/interfaces、/etc/hosts,/etc/resolv.conf 等等。
通常,用戶可能使用普通以太網(wǎng)卡、無線網(wǎng)卡、調(diào)制解調(diào)器等不同類型的設(shè)備接入網(wǎng)絡(luò)。不同類型的網(wǎng)絡(luò)設(shè)備在主機(jī)中被映射為相應(yīng)的網(wǎng)絡(luò)接口,比如以太網(wǎng)卡映射為eth,無線網(wǎng)卡映射為wlan。有時,用戶還可能同時使用多個網(wǎng)絡(luò)設(shè)備,就會出現(xiàn)eth0、eth1…,或wlan0、wlan1…的情況。
那么,如何標(biāo)識每個連接到Internet的網(wǎng)絡(luò)接口呢?
解決辦法是:為每個網(wǎng)絡(luò)接口分配一個全世界范圍內(nèi)惟一的32bit的標(biāo)識符。這個標(biāo)識符就是IP(Internet Protocol)地址。
配置IP地址
IP地址
IP地址包括三部分:Internet網(wǎng)絡(luò)號(Net-ID)、子網(wǎng)號(Subnet-ID)和主機(jī)號(Host-ID)。
因而可以這樣解釋:一個IP地址惟一標(biāo)識了,處在某個互聯(lián)網(wǎng)中的,某個子網(wǎng)的,某個網(wǎng)絡(luò)接口。
根據(jù)Internet網(wǎng)絡(luò)號的字段長度(1,2,3字節(jié)長),IP地址區(qū)分為A類、B類、C類。三類IP地址的掩碼如下所示。
A類地址的默認(rèn)子網(wǎng)掩碼是255.0.0.0,或0xFF000000;
B類地址的默認(rèn)子網(wǎng)掩碼是255.255.0.0,或0xFFFF0000;
C類地址的默認(rèn)子網(wǎng)掩碼是255.255.255.0,或0xFFFFFF00;
IP網(wǎng)絡(luò)中通常用最小的IP地址標(biāo)識網(wǎng)絡(luò)本身,將最大的IP地址作為該網(wǎng)絡(luò)的廣播地址,其余所有IP地址都分配給網(wǎng)絡(luò)中的主機(jī)。然而,局域網(wǎng)中的主機(jī)并不能直接訪問Internet,需要通過一個作為代理的網(wǎng)關(guān)或網(wǎng)絡(luò)地址轉(zhuǎn)換服務(wù)(NAT)才能訪問Internet。通常將IP地址的第一個或最后一個留給該網(wǎng)絡(luò)的Internet網(wǎng)關(guān)。
配置IP地址
接入網(wǎng)絡(luò)的計算機(jī)主機(jī)依靠IP地址,惟一地標(biāo)識其在網(wǎng)絡(luò)中的身份,因此為主機(jī)配置IP地址是接入網(wǎng)絡(luò)的關(guān)鍵。配置IP地址的方法有兩種:
配置靜態(tài)IP:在主機(jī)進(jìn)入網(wǎng)絡(luò)之前,事先為主機(jī)設(shè)置固定 的IP地址;
配置動態(tài)IP:選擇DHCP(動態(tài)主機(jī)配置協(xié)議(Dynamic host configuration protocol))網(wǎng)絡(luò)服務(wù),在主機(jī)進(jìn)入網(wǎng)絡(luò)之后,動態(tài)隨機(jī)獲取IP地址。
網(wǎng)絡(luò)相關(guān)命令
ifconfig命令
ifconfig是GNU/Linux中配置網(wǎng)卡的基本命令,包含在net-tools軟件包中。它可用于顯示或設(shè)置網(wǎng)卡的配置,如IP地址、子網(wǎng)掩碼、最大分組傳輸數(shù)、IO端口等,還可以啟動或禁用網(wǎng)卡。ifconfig命令有以下兩種格式:
ifconfig的第一種格式用于查看當(dāng)前系統(tǒng)的網(wǎng)絡(luò)配置情況;第二種格式用于配置網(wǎng)卡,包括添加、刪除網(wǎng)卡,以及綁定多個IP地址等。
從下面的運行結(jié)果可以看出,主機(jī)有兩個接口eth0、lo。lo代表主機(jī)本身,也稱回送接口(Loopback),其IP地址約定為127.0.0.1。
如果主機(jī)安裝了第二塊、第三塊網(wǎng)卡,則有eth1,eth2標(biāo)識。常見的接口類型還有以下幾種(N表示接口號):
pppN表示調(diào)制解調(diào)設(shè)備
wlanN表示無線網(wǎng)卡
trN表示令牌環(huán)網(wǎng)卡
如果只是關(guān)心某個網(wǎng)絡(luò)設(shè)備,可以在ifconfig后面加上接口名稱,則只顯示該設(shè)備的相關(guān)信息,例如:
假設(shè)主機(jī)現(xiàn)有的IP地址為192.168.182.129,需要為其重新分配IP地址192.168.182.128,即。使用ipconfig命令設(shè)置主機(jī)的第一塊網(wǎng)卡(eth0)的IP地址。
配置動態(tài)IP地址
在大型網(wǎng)絡(luò)中,由于存在許多的移動計算機(jī)系統(tǒng),隨時都可能進(jìn)入網(wǎng)絡(luò),在每次更換網(wǎng)絡(luò)時,就不得不重新配置網(wǎng)絡(luò)信息。如果計算機(jī)在網(wǎng)絡(luò)里能夠自動獲取IP地址、子網(wǎng)掩碼、路由表、DNS服務(wù)器地址等網(wǎng)絡(luò)信息,具有動態(tài)配置IP的能力,就可以大大簡化客戶端的網(wǎng)絡(luò)配置難度。動態(tài)主機(jī)配置協(xié)議(DHCP,Dynamic Host Configuration Protocol)可以實現(xiàn)動態(tài)分配IP資源。
只要在局域網(wǎng)中架設(shè)有DHCP服務(wù)器,在Ubuntu Linux中為主機(jī)配置DHCP客戶端是非常容易的。需要說明的是,通常普通以太網(wǎng)卡和無線網(wǎng)卡可以配置動態(tài)IP,而調(diào)制解調(diào)器等網(wǎng)絡(luò)設(shè)備不能配置動態(tài)IP。
動態(tài)IP的獲取過程
可比作一個“租賃”過程。DHCP服務(wù)器好比是IP地址的出租方,用戶主機(jī)(即DHCP客戶端)好比是IP地址的臨時租用者。
如果將用戶主機(jī)設(shè)置為DHCP客戶端之后,手動啟動網(wǎng)絡(luò)服務(wù),就可以從執(zhí)行結(jié)果中看出獲取動態(tài)IP的過程。
執(zhí)行過程中包括以下四個階段。
客戶端尋找DHCP服務(wù)器(DHCPDISCOVER):客戶端廣播申請動態(tài)IP的請求;
服務(wù)器提供可分配的IP地址(DHCPOFFER):所有接收到請求的DHCP服務(wù)器都將向客戶端提供一個IP地址;
客戶端接受IP地址租借(DHCPREQUEST):客戶端從多個IP選擇中挑選一個,通知DHCP服務(wù)器,并標(biāo)識出所選中的服務(wù)器;
服務(wù)器確認(rèn)租借IP(DHCPACK):被選中的DHCP服務(wù)器最后發(fā)出一個確認(rèn)信息,包含IP地址、子網(wǎng)掩碼、默認(rèn)網(wǎng)關(guān)、DNS服務(wù)器和租借期(客戶端使用這個IP的這段時間,稱為租借期)。
最終客戶端臨時“租借”的IP地址為192.168.182.129。
IP地址存放在哪里——interfaces配置文件
無論是配置靜態(tài)IP還是動態(tài)IP,計算機(jī)系統(tǒng)將IP信息保存放在什么地方?答案是配置文件“/etc/network/interfaces”。在Ubuntu Linux啟動時就能獲得IP地址的配置信息。若是配置靜態(tài)IP,就從配置文件中讀取IP地址參數(shù),直接配置網(wǎng)絡(luò)接口設(shè)備;若是配置動態(tài)IP,就通知主機(jī)通過DHCP協(xié)議獲取網(wǎng)絡(luò)配置。
以下分別為配置靜態(tài)IP和動態(tài)IP時,配置文件“/etc/network/interfaces”的實例。
DNS客戶端配置文件—resolv.conf
Ubuntu Linux將DNS服務(wù)器地址保存在配置文件/etc/resolv.conf中。
依然延續(xù)上面的例子,添加DNS服務(wù)器IP地址后,查看配置文件/etc/hosts,如下所示。
ping命令
ping(Packet Internet Groper)命令可能是最有名氣的網(wǎng)絡(luò)連接檢測工具。它使用了Internet控制報文協(xié)議(ICMP)回送請求與回送應(yīng)答報文,測試兩個主機(jī)之間的連通性。該命令的一般格式如下所示。
ping命令測試的遠(yuǎn)程主機(jī),既可用域名,也可用IP地址標(biāo)識。
可以使用該命令來判斷主機(jī)與遠(yuǎn)程主機(jī)是否可達(dá),或之間的網(wǎng)絡(luò)是否擁塞。min/avg/max/mdev是ping命令的完成測試后的統(tǒng)計結(jié)果,分別表示最小響應(yīng)時間/平均響應(yīng)時間/最大響應(yīng)時間/響應(yīng)時間方差。這些指標(biāo)用于反應(yīng)網(wǎng)絡(luò)的聯(lián)通程度。
可以使用該命令來判斷主機(jī)與遠(yuǎn)程主機(jī)是否可達(dá),或之間的網(wǎng)絡(luò)是否擁塞。min/avg/max/mdev是ping命令的完成測試后的統(tǒng)計結(jié)果,分別表示最小響應(yīng)時間/平均響應(yīng)時間/最大響應(yīng)時間/響應(yīng)時間方差。這些指標(biāo)用于反應(yīng)網(wǎng)絡(luò)的聯(lián)通程度。
ping命令執(zhí)行時,會持續(xù)不斷地向目的主機(jī)發(fā)送ICMP包。在得到對方的應(yīng)答后,顯示每次連接的統(tǒng)計數(shù)據(jù),直到用Ctrl+C組合鍵中斷執(zhí)行。但是,目前很多主機(jī)通過設(shè)置防火墻,對ping命令不予應(yīng)答。在這種情況下,ping命令由于不停地發(fā)送測試數(shù)據(jù)包,又得不到返回任何結(jié)果,而致使ping命令僵死。不過,使用-c參數(shù)設(shè)置發(fā)送測試數(shù)據(jù)包的次數(shù),以便在有限時間內(nèi)完成測試。
管理DNS服務(wù)器地址
DNS域名解析可以在更大范圍的計算機(jī)網(wǎng)絡(luò)、Internet,提供域名到IP地址的轉(zhuǎn)換。網(wǎng)絡(luò)中的每臺計算機(jī)都是一個DNS客戶端,向DNS服務(wù)器提交域名解析的請求;DNS服務(wù)器完成域名到IP地址的映射。
因此DNS客戶端至少有一個DNS服務(wù)器地址,作為命名解析的開端。
nslookup命令
使用nslookup命令可以查看當(dāng)前系統(tǒng)所使用的DNS服務(wù)器的IP地址。
服務(wù)器192.168.182.2完成了域名解析。Server表示提供服務(wù)的DNS服務(wù)器,Address中的#53表示TCP/UDP命名服務(wù)的端口號。若所有的DNS服務(wù)器都訪問失敗,則出現(xiàn)如下的執(zhí)行結(jié)果。
D3 Linux shell 腳本編程
3.1 shell 腳本 變量
shell腳本的基礎(chǔ)知識
shell腳本的本質(zhì)
編譯型語言
解釋型語言
shell腳本語言是解釋型語言 #!/bin/bash (指定shell 類型 )
shell腳本的本質(zhì): shell命令的有序集合
編程過程
基本過程分為三步:
step1. 建立 shell 文件
包含任意多行操作系統(tǒng)命令或shell命令的文本文件;
step2. 賦予shell文件執(zhí)行權(quán)限
用chmod命令修改權(quán)限;
r--read 讀權(quán)限 4 w--write 寫權(quán)限 2 x--execute 執(zhí)行權(quán)限 1
step3. 執(zhí)行shell文件
直接在命令行上調(diào)用shell程序.
編程過程演示
shell變量
shell允許用戶建立變量存儲數(shù)據(jù),但不支持?jǐn)?shù)據(jù)類型(整型、字符、浮點型),將任何賦給變量的值都解釋為一串字符
Variable=value
count=1
echo $count
DATE=date
echo $DATE
執(zhí)行 ./filename.sh or bash filename.sh
Bourne Shell有如下四種變量:
用戶自定義變量
位置變量即命令行參數(shù)
預(yù)定義變量
環(huán)境變量
用戶自定義變量
在shell編程中通常使用全大寫變量,方便識別
$ COUNT=1
變量的調(diào)用:在變量前加$
$ echo $HOME
Linux Shell/bash從右向左賦值,賦值時 ‘=’ 前后不能加空格
$Y=y
$ X=$Y
$ echo $X
y
使用unset命令刪除變量的賦值
$ Z=hello
$ echo $Z
hello
$ unset Z
$ echo $Z
命令置換`` 符號不要搞錯,命令置換使用的命令必須有輸出
位置變量
$0 與鍵入的命令行一樣,包含腳本文件名
$1,$2,……$9 分別包含第一個到第九個命令行參數(shù)
$# 包含命令行參數(shù)的個數(shù)
$@ 包含所有命令行參數(shù):“$1,$2,……$9”
$? 包含前一個命令的退出狀態(tài)
$* 包含所有命令行參數(shù):“$1,$2,……$9”
$$ 包含正在執(zhí)行進(jìn)程的ID號
傳10 個及以上參數(shù),取參 10{10}10{11}${12}…
特殊符號記得加’'轉(zhuǎn)義
環(huán)境變量
HOME: /etc/passwd文件中列出的用戶主目錄
IFS:Internal Field Separator, 默認(rèn)為空格,tab及換行符
PATH :shell搜索路徑
PS1,PS2:默認(rèn)提示符($)及換行提示符(>)
TERM:終端類型,常用的有vt100,ansi,vt200,xterm等
shell 腳本-功能語句
shell 程序由零或多條shell語句構(gòu)成。 shell語句包括三類:說明性語句、功能性語句和結(jié)構(gòu)性語句。
說明性語句:
以#號開始到該行結(jié)束,不被解釋執(zhí)行
功能性語句:
任意的shell命令、用戶程序或其它shell程序。
結(jié)構(gòu)性語句:
條件測試語句、多路分支語句、循環(huán)語句、循環(huán)控制語句等。
說明性語句
說明性語句(注釋行)
注釋行可以出現(xiàn)在程序中的任何位置,既可以單獨占用一行, 也可以接在執(zhí)行語句的后面. 以#號開始到所在行的行尾部分,都不被解釋執(zhí)行. 例如:
常用功能性語句
常用功能性語句(命令)
read從標(biāo)準(zhǔn)輸入讀入一行, 并賦值給后面的變量,其語法為:
read var
把讀入的數(shù)據(jù)全部賦給var
read var1 var2 var3
把讀入行中的第一個單詞(word)賦給var1, 第二個單詞賦給var2, ……把其余所有的詞賦給最后一個變量.
如果執(zhí)行read語句時標(biāo)準(zhǔn)輸入無數(shù)據(jù), 則程序在此停留等侯, 直到數(shù)據(jù)的到來或被終止運行。
read -p “輸入提示”
echo -n 代表不會在最后自動換行
echo -e 當(dāng)指定-e選項時,則將解釋反斜杠轉(zhuǎn)義字符
應(yīng)用實例
# example1 for read echo "Input your name: \c" read username echo "Your name is $username“#example2 for read echo "Input date with format yyyy mm dd: \c" read year month day echo "Today is $year/$month/$day, right?" echo "Press enter to confirm and continue\c" read answer echo "I know the date, bye!"算數(shù)運算 expr 命令
expr后邊必須加空格 運算符(+-*/?) 前后必須加空格
test語句
test語句可測試三種對象:
字符串 整數(shù) 文件屬性
每種測試對象都有若干測試操作符
例如:
test “$answer” = “yes”
變量answer的值是否為字符串yes
test $num –eq 18
變量num的值是否為整數(shù)18
test -d tmp
測試tmp是否為一個目錄名
字符串測試
s1 = s2 測試兩個字符串的內(nèi)容是否完全一樣,是返回0
s1 != s2 測試兩個字符串的內(nèi)容是否有差異,是返回0
-z s1 測試s1 字符串的長度是否為0,是返回0
-n s1 測試s1 字符串的長度是否不為0,是返回0
整數(shù)測試
舉例子
1 #!/bin/bash
2 test 3 -eq 3
3 echo KaTeX parse error: Expected 'EOF', got '#' at position 4: ? #?`? `包含前一個命令的退出狀態(tài)
a -eq b 測試a 與b 是否相等
a -ne b 測試a 與b 是否不相等
a -gt b 測試a 是否大于b
a -ge b 測試a 是否大于等于b
a -lt b 測試a 是否小于b
a -le b 測試a 是否小于等于b
文件測試
舉例子:
#!/bin/bash
test -f read.sh
echo $?
-d name 測試name 是否為一個目錄
-e name 測試一個文件是否存在
-f name 測試name 是否為普通文件
-L name 測試name 是否為符號鏈接
-r name 測試name 文件是否存在且為可讀
-w name 測試name 文件是否存在且為可寫
-x name 測試name 文件是否存在且為可執(zhí)行
-s name 測試name 文件是否存在且其長度不為0
f1-nt f2 測試文件f1 是否比文件f2 更新
f1-ot f2 測試文件f1 是否比文件f2 更舊
測試語句記得把test 寫前邊去
3.2 shell 腳本-結(jié)構(gòu)性語句
結(jié)構(gòu)性語句主要根據(jù)程序的運行狀態(tài)、輸入數(shù)據(jù)、變量的取值、控制信號以及運行時間等因素來控制程序的運行流程。
主要包括:條件測試語句(兩路分支)、多路分支語句、循環(huán)語句、循環(huán)控制語句和后臺執(zhí)行語句等。
if 條件 then 處理邏輯 fi
條件語句
條件語句1
if…then…fi
語法結(jié)構(gòu):
if 表達(dá)式
then 命令表
fi
如果表達(dá)式為真, 則執(zhí)行命令表中的命令; 否則退出if語句, 即執(zhí)行fi后面的語句。
if和fi是條件語句的語句括號, 必須成對使用;
命令表中的命令可以是一條, 也可以是若干條。
實例
shell程序prog2.sh(測試命令行參數(shù)是否為已存在的文件或目錄)。用法為:
./prog2.sh file
代碼如下:
執(zhí)行prog2程序:
$ ./prog2.sh prog1.sh
File prog1.sh exists
$0為prog2.sh; $1為prog1.sh, 是一個已存在的文件.
$ ./prog2.sh backup
File backup is a directory
$0為prog2.sh; $1為backup,是一個已存在的目錄.
如果不帶參數(shù), 或大于一個參數(shù)運行prog2, 例如:
$ ./prog2.sh (或 $ ./prog2.sh file1 file2)
會出現(xiàn)什么結(jié)果?
條件語句2
if…then…else…fi
語法結(jié)構(gòu)為:
if 表達(dá)式
then 命令表1
else 命令表2
fi
如果表達(dá)式為真, 則執(zhí)行命令表1中的命令, 再退出if語句; 否則執(zhí)行命令表2中的語句, 再退出if語句.
注意: 無論表達(dá)式是否為真, 都有語句要執(zhí)行.
實例
test命令的使用
test命令測試的條件成立時, 命令返回值為真(0),否則返回值為假(非0).
方式一:test $name -eq $1echo $?方式二:if test -f $filenamethen ……fi方式三:if [ -f $filename ]then ……fi用方括號替代test語句,注意方括號前后至少有一個空格實例
例子: shell程序prog3.sh, 用法為:
./prog3.sh file
內(nèi)容如下:
運行prog3.sh程序:
$ ./prog3.sh backup
backup is a directory
$ ./prog3.sh prog1
prog1 is a common file
$ ./prog3.sh abc
unknown
prog3.sh是對prog2.sh的優(yōu)化, 邏輯結(jié)構(gòu)更加清晰合理!
shell 布爾運算符
多路分支語句
case…esac
實例
實例. 程序prog4.sh檢查用戶輸入的文件名, 用法為:
./prog4.sh string_name
循環(huán)語句
循環(huán)語句for的用法
當(dāng)循環(huán)次數(shù)已知或確定時,使用for循環(huán)語句來多次執(zhí)行一條或一組命令。 循環(huán)體由語句括號do和done來限定。格式為:
for 變量名 in 單詞表
do
命令表
done
變量依次取單詞表中的各個單詞, 每取一次單詞, 就執(zhí)行一次循環(huán)體中的命令. 循環(huán)次數(shù)由單詞表中的單詞數(shù)確定. 命令表中的命令可以是一條, 也可以是由分號或換行符分開的多條。
如果單詞表是命令行上的所有位置參數(shù)時, 可以在for語句中省略 “in 單詞表” 部分。
實例
實例:程序prog5.sh拷貝當(dāng)前目錄下的所有文件到backup子目錄下. 使用語法為: ./prog5.sh [filename]
while循環(huán)
語法結(jié)構(gòu)為:
while 命令或表達(dá)式
do
命令表
done
while語句首先測試其后的命令或表達(dá)式的值,如果為真,就執(zhí)行一次循環(huán)體中的命令,然后再測試該命令或表達(dá)式的值,執(zhí)行循環(huán)體,直到該命令或表達(dá)式為假時退出循環(huán)。
while語句的退出狀態(tài)為命令表中被執(zhí)行的最后一條命令的退出狀態(tài)。
實例
創(chuàng)建文件程序prog6, 批量生成空白文件,用法為:
prog6 file [number] ./a.sh file 6
循環(huán)控制語句
break 和 continue
break n 則跳出n層;
continue語句則馬上轉(zhuǎn)到最近一層循環(huán)語句的下一輪循環(huán)上,
continue n則轉(zhuǎn)到最近n層循環(huán)語句的下一輪循環(huán)上.
實例. 程序prog7的用法為:
prog7 整數(shù) 整數(shù) 整數(shù) …
參數(shù)個數(shù)不確定, 范圍為1~10個, 每個參數(shù)都是正整數(shù)。
3.3 shell 腳本-函數(shù)
shell函數(shù)調(diào)用
實例
check_user( ) { #查找已登錄的指定用戶user=`who | grep $1 | wc -l`if [ $user –eq 0 ]thenreturn 0 #未找到指定用戶elsereturn 1 #找到指定用戶fi } while true # MAIN, Main, main: program begin here doecho "Input username: \c"read unamecheck_user $uname # 調(diào)用函數(shù), 并傳遞參數(shù)unameif [ $? –eq 1 ] # $?為函數(shù)返回值then echo "user $uname online"else echo "user $uname offline"fi done函數(shù)變量作用域
全局作用域:在腳本的其他任何地方都能夠訪問該變量。
局部作用域:只能在聲明變量的作用域內(nèi)訪問。
聲明局部變量的格式:
Local variable_name =value
結(jié)果
$(1-9)放函數(shù)內(nèi)部,表示函數(shù)參數(shù),不再是名令行參數(shù)
注意方法內(nèi)的變量默認(rèn)是全局的,局部變量需要加local 修飾。
D4 Linux C高級語言編程
4.1 gcc 編譯器和gdb
gcc 編譯器
GNU工具
編譯工具:把一個源程序編譯為一個可執(zhí)行程序
調(diào)試工具:能對執(zhí)行程序進(jìn)行源碼或匯編級調(diào)試
軟件工程工具:用于協(xié)助多人開發(fā)或大型軟件項目的管理,如make、CVS、Subvision
其他工具:用于把多個目標(biāo)文件鏈接成可執(zhí)行文件的鏈接器,或者用作格式轉(zhuǎn)換的工具。
部分相關(guān)資源
http://www.gnu.org/
http://gcc.gnu.org/
http://www.kernel.org/
http://www.linux.org/
http://www.linuxdevices.com/
http://sourceforge.net/index.php
GCC簡介
全稱為GNU CC ,GNU項目中符合ANSI C標(biāo)準(zhǔn)的編譯系統(tǒng)
編譯如C、C++、Object C、Java、Fortran、Pascal、Modula-3和Ada等多種語言
GCC是可以在多種硬體平臺上編譯出可執(zhí)行程序的超級編譯器,其執(zhí)行效率與一般的編譯器相比平均效率要高20%~30%
一個交叉平臺編譯器 ,適合在嵌入式領(lǐng)域的開發(fā)編譯
GCC編譯器的版本
GNU Compiler Collection
C, C++, Objective-C, Fortran, Java, Ada
http://gcc.gnu.org
gcc所支持后綴名解釋
.c C原始程序 .C/.cc/.cxx C++原始程序 .h 預(yù)處理文件(頭文件) .i 已經(jīng)過預(yù)處理的C原始程序 .ii 已經(jīng)過預(yù)處理的C++原始程序 .s/.S 匯編語言原始程序 .o 目標(biāo)文件 .a/.so 編譯后的庫文件編譯器的主要組件
分析器:分析器將源語言程序代碼轉(zhuǎn)換為匯編語言。因為要從一種格式轉(zhuǎn)換為另一種格式(C到匯編),所以分析器需要知道目標(biāo)機(jī)器的匯編語言。
匯編器:匯編器將匯編語言代碼轉(zhuǎn)換為CPU可以執(zhí)行字節(jié)碼。
鏈接器:鏈接器將匯編器生成的單獨的目標(biāo)文件組合成可執(zhí)行的應(yīng)用程序。鏈接器需要知道這種目標(biāo)格式以便工作。
標(biāo)準(zhǔn)C庫:核心的C函數(shù)都有一個主要的C庫來提供。如果在應(yīng)用程序中用到了C庫中的函數(shù),這個庫就會通過鏈接器和源代碼連接來生成最終的可執(zhí)行程序
GCC的基本用法和選項
Gcc最基本的用法是∶gcc [options] [filenames]
-c,只編譯,不連接成為可執(zhí)行文件,編譯器只是由輸入的.c等源代碼文件生成.o為后綴的目標(biāo)文件,通常用于編譯不包含主程序的子程序文件。
-o output_filename,確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預(yù)設(shè)的可執(zhí)行文件a.out。
-g,產(chǎn)生符號調(diào)試工具(GNU的gdb)所必要的符號資訊,要想對源代碼進(jìn)行調(diào)試,我們就必須加入這個選項。
-O,對程序進(jìn)行優(yōu)化編譯、連接,采用這個選項,整個源代碼會在編譯、連接過程中進(jìn)行優(yōu)化處理,這樣產(chǎn)生的可執(zhí)行文件的執(zhí)行效率可以提高,但是,編譯、連接的速度就相應(yīng)地要慢一些。
-O2,比-O更好的優(yōu)化編譯、連接,當(dāng)然整個編譯、連接過程會更慢。
-I dirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預(yù)編譯過程中使用的參數(shù)。
-L dirname,將dirname所指出的目錄加入到程序函數(shù)檔案庫文件的目錄列表中,是在鏈接過程中使用的參數(shù)。
GCC 全稱為GNU CC ,GNU項目中符合ANSI C標(biāo)準(zhǔn)的編譯系統(tǒng),編譯如C、C++、Object C、Java、Fortran、Pascal、Modula-3和Ada等多種語言
GCC的錯誤類型及對策
第一類∶C語法錯誤
錯誤信息∶文件source.c中第n行有語法錯誤(syntex errror)。有些情況下,一個很簡單的語法錯誤,gcc會給出一大堆錯誤,我們最主要的是要保持清醒的頭腦,不要被其嚇倒,必要的時候再參考一下C語言的基本教材。
第二類∶頭文件錯誤
錯誤信息∶找不到頭文件head.h(Can not find include file head.h)。這類錯誤是源代碼文件中的包含頭文件有問題,可能的原因有頭文件名錯誤、指定的頭文件所在目錄名錯誤等,也可能是錯誤地使用了雙引號和尖括號。
第三類∶檔案庫錯誤
錯誤信息∶鏈接程序找不到所需的函數(shù)庫(ld: -lm: No such file or directory )。這類錯誤是與目標(biāo)文件相連接的函數(shù)庫有錯誤,可能的原因是函數(shù)庫名錯誤、指定的函數(shù)庫所在目錄名稱錯誤等,檢查的方法是使用find命令在可能的目錄中尋找相應(yīng)的函數(shù)庫名,確定檔案庫及目錄的名稱并修改程序中及編譯選項中的名稱。
第四類∶未定義符號
錯誤信息∶有未定義的符號(Undefined symbol)。
這類錯誤是在鏈接過程中出現(xiàn)的,可能有兩種原因∶一是使用者自己定義的函數(shù)或者全局變量所在源代碼文件,沒有被編譯、連接,或者干脆還沒有定義;二是未定義的符號是一個標(biāo)準(zhǔn)的庫函數(shù),在源程序中使用了該庫函數(shù),而連接過程中還沒有給定相應(yīng)的函數(shù)庫的名稱,或者是該檔案庫的目錄名稱有問題,這時需要使用檔案庫維護(hù)命令ar檢查我們需要的庫函數(shù)到底位于哪一個函數(shù)庫中,確定之后,修改gcc連接選項中的-l和-L項。
GCC使用實例
#include<stdio.h> int main(void) { int i,j; j=0; i=j+1; printf(“hello,world\n”); printf(“the result is %d\n”,i); } 編譯:gcc -0 test test.c 執(zhí)行: ./test 查看更詳細(xì)的信息:gcc -v -o test.cGCC編譯過程
GCC的編譯流程分為四個步驟:
預(yù)處理(Pre-Processing)
編譯(Compiling)
匯編(Assembling)
鏈接(Linking)
“hello”的演變歷程
生成預(yù)處理代碼
gcc -E test.c -o tset.i用wc 命令,查看兩個階段代碼大小 wc test.c test
test.i比test.c增加了很多內(nèi)容,主要是放在系統(tǒng)提供的include文件中的。
生成匯編代碼
檢查語法錯誤,并生成匯編文件
gcc -S test.i -o test.s
生成目標(biāo)代碼
方法一,直接從C源代碼中生成目標(biāo)代碼 gcc -c test.c -o test.o方法二,用匯編器從匯編代碼生成目標(biāo)代碼 as test.s -o test.o生成可執(zhí)行程序
將目標(biāo)程序鏈接庫資源,生成可執(zhí)行程序
gcc test.o -o test
./test
GDB調(diào)試工具
調(diào)試器–Gdb調(diào)試流程
首先使用gcc對test.c進(jìn)行編譯,注意一定要加上選項‘-g’
流程
查看文件 l
查看變量值p n
設(shè)置斷點 b 6
單步運行 n | s
查看斷點情況 info b
恢復(fù)程序運行 c
運行代碼 r
幫助 help
Gdb的使用切記點
編譯必須加入-g
只有在代碼處于運行或暫停狀態(tài)時才能查看變量值
設(shè)置斷點后程序在指定行之前停止
gdb filename 進(jìn)入調(diào)試模式
4.2 C語言高級編程-條件編譯和結(jié)構(gòu)體
條件編譯
編譯器根據(jù)條件的真假決定是否編譯相關(guān)的代碼
一、根據(jù)宏是否定義,其語法如下:
#ifdef <macro>……#else……#endif #define _DEBUG_ #ifdef _DEBUG_ printf(“The macro _DEBUG_ is defined\n”); #else printf(“The macro _DEBUG_ is not defined\n”); #endif注意:#ifdef 可以寫成 #ifndef 則功能相反
二、根據(jù)宏的值,其語法如下
#if <macro> …… #else …… #endif #define _DEBUG_ 1 #if _DEBUG_ printf(“The macro _DEBUG_ is defined\n”); #else printf(“The macro _DEBUG_ is not defined\n”); #endif三、gcc 時宏的定義
在gcc中, 可在命令行中指定對象宏的定義:
e.g.
$ gcc -Wall -DMAX=100 -o tmp tmp.c
相當(dāng)于在tmp.c中添加" #define MAX 100".
那么, 如果原先tmp.c中含有MAX宏的定義, 那么再在gcc調(diào)用命令中使用-DMAX, 會出現(xiàn)什么情況呢?
—若-DMAX=1, 則正確編譯.
—若-DMAX的值被指定為不為1的值, 那么gcc會給出MAX宏被重定義的警告, MAX的值仍為1.
注意: 若在調(diào)用gcc的命令行中不顯示地給出對象宏的值, 那么gcc賦予該宏默認(rèn)值(1), 如: -DVAL == -DVAL=1
D5 Makefile
5.1 Make介紹
Make簡介
工程管理器,顧名思義,是指管理較多的文件
Make工程管理器也就是個“自動編譯管理器”,這里的“自動”是指它能夠根據(jù)文件時間戳自動發(fā)現(xiàn)更新過的文件而減少編譯的工作量,同時,它通過讀入Makefile文件的內(nèi)容來執(zhí)行大量的編譯工作
Make將只編譯改動的代碼文件,而不用完全編譯。
Makefile基本結(jié)構(gòu)
Makefile是Make讀入的唯一配置文件
由make工具創(chuàng)建的目標(biāo)體(target),通常是目標(biāo)文件或可執(zhí)行文件
要創(chuàng)建的目標(biāo)體所依賴的文件(dependency_file)
創(chuàng)建每個目標(biāo)體時需要運行的命令(command)
注意:命令行前面必須是一個”TAB鍵”,否則編譯錯誤為:*** missing separator. Stop.
Makefile格式
target : dependency_files
command
例子
一個復(fù)雜一些的例子
sunq:kang.o yul.ogcc kang.o yul.o -o sunq kang.o : kang.c kang.h gcc –Wall –O -g –c kang.c -o kang.o yul.o : yul.c gcc - Wall –O -g –c yul.c -o yul.o注釋:-Wall:表示允許發(fā)出gcc所有有用的報警信息.
-c:只是編譯不鏈接,生成目標(biāo)文件”.o”
-o file:表示把輸出文件輸出到file里
Makefile 注釋符
# 字符是注釋符
makefile 把 # 字符后面的內(nèi)容作為注釋內(nèi)容處理(shell、perl 腳本也是使用 # 字符作為注釋符)。
如果某行的第一個非空字符為 #,則此行會被 make 解釋為注釋行(命令行除外,如果 Tab 字符之后使用 # 字符,則會被 make 解釋為命令行。
注釋行的結(jié)尾如果存在反斜線(\),那么下一行也被作為注釋行。
Makefile變量
創(chuàng)建和使用變量
創(chuàng)建變量的目的:用來代替一個文本字符串:
1. 系列文件的名字 2. 傳遞給編譯器的參數(shù) 3. 需要運行的程序 4. 需要查找源代碼的目錄 5. 你需要輸出信息的目錄 6. 你想做的其它事情。變量定義的兩種方式
遞歸展開方式VAR=var
簡單方式 VAR := var
變量使用 $(VAR)
用””則用””則用””則用”$”來表示
類似于編程語言中的宏
剛才的例子
OBJS = kang.o yul.o CC = gcc CFLAGS = -Wall -O -g sunq : $(OBJS)$(CC) $(OBJS) -o sunq kang.o : kang.c kang.h$(CC) $(CFLAGS) -c kang.c -o kang.o yul.o : yul.c yul.h$(CC) $(CFLAGS) -c yul.c -o yul.o遞歸展開方式VAR=var
例子:
foo = $(bar)
bar = $(ugh)
ugh = Huh?
$(foo)的值為?
echo $(foo)來進(jìn)行查看
優(yōu)點:
它可以向后引用變量
缺點:
不能對該變量進(jìn)行任何擴(kuò)展,例如
CFLAGS = $(CFLAGS) -O
會造成死循環(huán)
簡單方式:VAR:=var
m := mm x := $(m) y := $(x) bar x := later all:echo $(x) $(y)linux@linux:~/file/tmp$ make
echo later mm bar
later mm bar
用這種方式定義的變量,會在變量的定義點,按照被引用的變量的當(dāng)前值進(jìn)行展開
這種定義變量的方式更適合在大的編程項目中使用,因為它更像我們一般的編程語言
用?=定義變量
dir := /foo/bar
FOO ?= bar
FOO是?
含義是,如果FOO沒有被定義過,那么變量FOO的值就是“bar”,如果FOO先前被定義過,那么這條語將什么也不做,其等價于:
ifeq ($(origin FOO), undefined)
FOO = bar
endif
為變量添加值
你可以通過+=為已定義的變量添加新的值
Main=hello.o hello-1.o
Main+=hello-2.o
特殊變量
預(yù)定義變量
AR 庫文件維護(hù)程序的名稱,默認(rèn)值為ar。AS匯編程序的名稱,默認(rèn)值為as。
CC C編譯器的名稱,默認(rèn)值為cc。CPP C預(yù)編譯器的名稱,默認(rèn)值為$(CC) –E。
CXX C++編譯器的名稱,默認(rèn)值為g++。
FC FORTRAN編譯器的名稱,默認(rèn)值為f77
RM 文件刪除程序的名稱,默認(rèn)值為rm -f
例子:
Hello: main.c main.h
$(CC) –o hello main.c
clean:
$(RM) hello
其他預(yù)定義變量
ARFLAGS 庫文件維護(hù)程序的選項,無默認(rèn)值。
ASFLAGS 匯編程序的選項,無默認(rèn)值。
CFLAGS C編譯器的選項,無默認(rèn)值。
CPPFLAGS C預(yù)編譯的選項,無默認(rèn)值。
CXXFLAGS C++編譯器的選項,無默認(rèn)值。
FFLAGS FORTRAN編譯器的選項,無默認(rèn)值。
剛才的例子
OBJS = kang.o yul.o
CC = gcc
CFLAGS = -Wall -O -g
sunq : $(OBJS)
$(CC) $(OBJS) -o sunq
kang.o : kang.c kang.h
$(CC) $(CFLAGS) -c kang.c -o kang.o
yul.o : yul.c yul.h
$(CC) $(CFLAGS) -c yul.c -o yul.o
自動變量
$* 不包含擴(kuò)展名的目標(biāo)文件名稱
$+ 所有的依賴文件,以空格分開,并以出現(xiàn)的先后為序,可能 包含重復(fù)的依賴文件
$< 第一個依賴文件的名稱
$? 所有時間戳比目標(biāo)文件晚的的依賴文件,并以空格分開
$@ 目標(biāo)文件的完整名稱
$^ 所有不重復(fù)的目標(biāo)依賴文件,以空格分開
$% 如果目標(biāo)是歸檔成員,則該變量表示目標(biāo)的歸檔成員名稱
make運行環(huán)境變量
make在啟動時會自動讀取系統(tǒng)當(dāng)前已經(jīng)定義了的環(huán)境變量,并且會創(chuàng)建與之具有相同名稱和數(shù)值的變量
如果用戶在Makefile中定義了相同名稱的變量,那么用戶自定義變量將會覆蓋同名的環(huán)境變量
直接運行make
選項
-C dir讀入指定目錄下的Makefile
-f file讀入當(dāng)前目錄下的file文件作為Makefile
-I 忽略所有的命令執(zhí)行錯誤
-I dir指定被包含的Makefile所在目錄
-n 只打印要執(zhí)行的命令,但不執(zhí)行這些命令
-p 顯示make變量數(shù)據(jù)庫和隱含規(guī)則
-s 在執(zhí)行命令時不顯示命令
-w 如果make在執(zhí)行過程中改變目錄,打印當(dāng)前目錄名
靜態(tài)模式1
Makefile 靜態(tài)模式——$(objects): %.o: %.c
靜態(tài)模式+自動化變量
舉例
objects = foo.o bar.o all: $(objects) $(objects): %.o: %.c $(CC) -c $(CFLAGS) $< -o $@等價于?
foo.o : foo.c $(CC) -c $(CFLAGS) foo.c -o foo.o bar.o : bar.c $(CC) -c $(CFLAGS) bar.c -o bar.o偽目標(biāo)
test:f1.o f2.o main.ogcc f1.o f2.o main.o -o test f2.o:f2.cgcc -c f2.c -o f2.o f1.o:f1.cgcc -c f1.c -o f1.o main.o:main.cgcc -c main.c -o main.o .PHONY:clean // 將clean 定義為偽目標(biāo),表明claen 不是一個可執(zhí)行文件,避免在同級目錄存在同名文件時,make 報錯: clean:rm *.o test設(shè)置偽目標(biāo)前:
設(shè)置偽目標(biāo)后:
Makefile的隱含規(guī)則
隱含規(guī)則1:編譯C程序的隱含規(guī)則
“.o”的目標(biāo)的依賴目標(biāo)會自動推導(dǎo)為“.c”,并且其生成命令是“$(CC) –c $(CPPFLAGS) $(CFLAGS)”
隱含規(guī)則2:鏈接Object文件的隱含規(guī)則
“” 目標(biāo)依賴于“.o”,通過運行C的編譯器來運行鏈接程序生成(一般是“l(fā)d”),其生成命令是:“$(CC) $(LDFLAGS) .o $(LOADLIBES) $(LDLIBS)”。這個規(guī)則對于只有一個源文件的工程有效,同時也對多個Object文件(由不同的源文件生成)的也有效。例如如下規(guī)則:
x : x.o y.o z.o
并且“x.c”、“y.c”和“z.c”都存在時,隱含規(guī)則將執(zhí)行如下命令:
cc -c x.c -o x.o
cc -c y.c -o y.o
cc -c z.c -o z.o
cc x.o y.o z.o -o x
如果沒有一個源文件(如上例中的x.c)和你的目標(biāo)名字(如上例中的x)相關(guān)聯(lián),那么,你最好寫出自己的生成規(guī)則,不然,隱含規(guī)則會報錯的。
生成多個可執(zhí)行文件
makefile 默認(rèn)只生成第一個可執(zhí)行文件,所以為了同時編譯多個可執(zhí)行文件,我們用到了偽可執(zhí)行文件,make 過程中并不生成 這個偽可執(zhí)行文件,利用依賴的屬性,同時生成三個可執(zhí)行文件
all : init sender receiver .PHONY : clean init : init.o common.occ -pthread -o init init.o common.o sender : sender.o common.occ -pthread -o sender sender.o common.o receiver : receiver.o common.occ -pthread -o receiver receiver.o common.o init.o : common.h sender.o : common.h receiver.o : common.h clean : rm init rm receiverrm sender rm *.o5.2 make命令的選項及Make
使用make 管理器非常簡單,只需在make 命令的后面鍵入目標(biāo)名即可建立指定的目標(biāo)。如果直接運行make,則建立Makefile中的第一個目標(biāo)。
命令行選項:
5.3 VPATH及嵌套的Makefile
Makefile的VPATH
VPATH : 虛路徑
在一些大的工程中,有大量的源文件,我們通常的做法是把這許多的源文件分類,并存放在不同的目錄中。所以,當(dāng)make需要去找尋文件的依賴關(guān)系時,你可以在文件前加上路徑,但最好的方法是把一個路徑告訴make,讓make在自動去找。
Makefile文件中的特殊變量“VPATH”就是完成這個功能的,如果沒有指明這個變量,make只會在當(dāng)前的目錄中去找尋依賴文件和目標(biāo)文件。如果定義了這個變量,那么,make就會在當(dāng)當(dāng)前目錄找不到的情況下,到所指定的目錄中去找尋文件了。
VPATH = src:…/headers
上面的的定義指定兩個目錄,“src”和“…/headers”,make會按照這個順序進(jìn)行搜索。目錄由“冒號”分隔。(當(dāng)然,當(dāng)前目錄永遠(yuǎn)是最高優(yōu)先搜索的地方)
案例
CC=gcc CFLAGS=-c -Wall -I include VPATH=src1:src2:main f1:f1.o f2.o main.o$(CC) $(CFLAGS) $^ -o $@ .PHONY:clean clean:find ./ -name "*.o" -exec rm {} \;;rm f1'linux中的 exec命令,-exec 后面跟的是linux的 command 命令,exec命令以分號結(jié)束‘;’, 該分號前面要放反斜杠轉(zhuǎn)義 。{} 花括號代表前面的命令執(zhí)行的結(jié)果
Makefile的嵌套
我們注意到有一句@echo $(SUBDIRS)
@echo off 的意思是關(guān)閉回顯,不顯示正在執(zhí)行的批處理命令及執(zhí)行的結(jié)果等。
語法:echo [{on off}] [message] 示例:@echo off / echo hello world。
當(dāng)echo設(shè)置off值的時候,那么下面的指令都將只執(zhí)行而不顯示,當(dāng)再次出現(xiàn)echo on時下面的語句才為可見的(回顯)。
echo通常和@一起使用,@放在echo的前面,即是 @echo,作用是讓@后面的句子不顯示出來,而@本身也是不顯示的
通過 @echo off 可達(dá)到不顯示任何信息的效果。
@(RM)并不是我們自己定義的變量,那它是從哪里來的呢?
預(yù)定義變量 : RM 文件刪除程序的名稱,默認(rèn)值為rm -f
make -C @‘?Cdir讀入指定目錄下的Makefile‘‘@ ` -C dir讀入指定目錄下的Makefile` `@‘?Cdir讀入指定目錄下的Makefile‘‘@ ——目標(biāo)文件的名稱`
課程案例
工程文件如下:
可以看主Makefile文件內(nèi)容如下
CC=gcc #同一行命令換行結(jié)尾加 '\' 聲明未結(jié)束。 SUBDIRS=f1 \f2 \main \obj OBJS=f1.o f2.o main.o BIN=myapp OBJS_DIR=obj BIN_DIR=bin #export的作用是將變量傳遞給子目錄下的Makefile文件以供它們使用 export CC OBJS BIN OBJS_DIR BIN_DIRall:CHECK_DIR $(SUBDIRS) CHECK_DIR:mkdir -p $(BIN_DIR) $(SUBDIRS):ECHOmake -C $@ ECHO:@echo $(SUBDIRS)@echo begin compile CLEAN:@$(RM) $(OBJS_DIR)/*.o@rm -rf $(BIN_DIR)其他案例:
在一些大的工程中,我們會把我們不同模塊或是不同功能的源文件放在不同的目錄中,我們可以在每個目錄中都書寫一個該目錄的 Makefile,這有利于讓我們的 Makefile 變得更加地簡潔,而不至于把所有的東西全部寫在一個 Makefile 中,這樣會很難維護(hù)我們的 Makefile,這個技術(shù)對于我們模塊編譯和分段編譯有著非常大的好處。
工程文件如下
可以看主makefile文件內(nèi)容如下
其中$(MAKE) -C (SRCDIR)是到對應(yīng)的子目錄下執(zhí)行make,使用(SRC_DIR)是到對應(yīng)的子目錄下執(zhí)行make,使用(SRCD?IR)是到對應(yīng)的子目錄下執(zhí)行make,使用(MAKE)是為了方便以后可以添加適當(dāng)?shù)膍ake參數(shù),-C參數(shù)是在進(jìn)入或者退出目錄時打印出來。
export的作用是將變量傳遞給子目錄下的Makefile文件以供它們使用。
版權(quán)聲明:本文為CSDN博主「juruiyuan111」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/juruiyuan111/article/details/119894932
注腳
?
這個靜態(tài)模式就是一種自動編譯模式,在這種模式下,我們可以容易的定義“多目標(biāo)”規(guī)則,讓我們的規(guī)則變得更加有彈性和靈活。它的語法如下:
< targets …> : < target-pattern > : < prereq-patterns …>
<commands>
…
其中:
targets定義了一些列的目標(biāo)文件,也就是多目標(biāo),可以有通配符,是目標(biāo)的一個集合。
target-pattern 是targets的模式,也就是目標(biāo)集模式
prereq-patterns 則是目標(biāo)的“依賴”元素,
這么去說,可能還是比較拗口,不容易理解,我們還是把理論落地,舉例一下吧:
我們把target-pattern 定義成 %.o 意思是我們的target集合都是以.o結(jié)尾。當(dāng)然這里也可以使用通配符*,只不過%多用于Makefile,他們兩個的區(qū)別,我們后面再講。而我們的prereq-patterns則定義為%.c,這意思就是對 target-pattern中所形成的目標(biāo)集進(jìn)行二次定義,其計算方法是取target-pattern模式中的%代表部分(其實就是去掉.o后的文件名),并為其加上[.c]結(jié)尾,形成新的集合。
————————————————
版權(quán)聲明:本文為CSDN博主「豬哥-嵌入式」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u012351051/article/details/88600562 ??
總結(jié)
以上是生活随笔為你收集整理的LV.2 Linux C语言高级的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql查询学生表的总人数,MySQL
- 下一篇: JavaScript实用功能代码片段