Linux系統(tǒng)管理與應(yīng)用 課件 第15-17章 LINUX編程概述、LINUX語言環(huán)境、Linux內(nèi)核概述_第1頁
Linux系統(tǒng)管理與應(yīng)用 課件 第15-17章 LINUX編程概述、LINUX語言環(huán)境、Linux內(nèi)核概述_第2頁
Linux系統(tǒng)管理與應(yīng)用 課件 第15-17章 LINUX編程概述、LINUX語言環(huán)境、Linux內(nèi)核概述_第3頁
Linux系統(tǒng)管理與應(yīng)用 課件 第15-17章 LINUX編程概述、LINUX語言環(huán)境、Linux內(nèi)核概述_第4頁
Linux系統(tǒng)管理與應(yīng)用 課件 第15-17章 LINUX編程概述、LINUX語言環(huán)境、Linux內(nèi)核概述_第5頁
已閱讀5頁,還剩92頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第五章Linux編程概述本章學(xué)習(xí)目標(biāo)⊙ Linux下程序設(shè)計(jì)的特點(diǎn)⊙ Linux下程序設(shè)計(jì)的IDE的使用⊙ Linux的編程風(fēng)格15.1Linux程序設(shè)計(jì)語言概述Linux編程C/C++JavaPythonRubyPerlPHP15.1.1Linux編程Linux的軟件開發(fā):一般都基于Internet許多用于Linux的編程工具都源于自由軟件基金會(huì)(FSF)。所有的工具都可以免費(fèi)獲得,并且得到的源代碼可在GNUGPL的指導(dǎo)下自由修改。Linux的程序需要首先轉(zhuǎn)化為低級(jí)機(jī)器語言,才能被操作系統(tǒng)執(zhí)行。15.1.2C/C++C語言:除了匯編語言,最接近機(jī)器的語言各種操作系統(tǒng)的編程接口的默認(rèn)語言都是CC++是C語言的加強(qiáng)版:C++增加了面向?qū)ο蠛推渌杏玫墓δ?,但它的效能并沒有大減,編程更方便輕松C++與c:C++支持大部分C的程序,大部分的C編譯器也支持C++類Unix操作系統(tǒng)中,C具有很好的開放源代碼的條件C/C++具有現(xiàn)代語言的大量特征:(1)語句簡(jiǎn)練、結(jié)構(gòu)清晰、緊湊,使用方便、靈活。(2)程序結(jié)構(gòu)簡(jiǎn)單、書寫格式自由。(3)數(shù)據(jù)類型豐富、齊全。(4)運(yùn)算符豐富、齊全,運(yùn)算能力強(qiáng)。(5)語法限制不太嚴(yán)格,程序自由度大。(6)具有直接的硬件處理能力。(7)C/C++編譯系統(tǒng)生成的目標(biāo)代碼質(zhì)量高,效率高。(8)程序可移植性強(qiáng)。(9)語言的通用性較強(qiáng)。15.1.3JavaJava語言:是SUN公司的產(chǎn)品,完全的面向?qū)ο蟮木幊陶Z言,不同的計(jì)算機(jī)平臺(tái)上運(yùn)行,適合編寫網(wǎng)絡(luò)應(yīng)用程序。廣泛應(yīng)用于企業(yè)、個(gè)人終端、移動(dòng)通信等眾多領(lǐng)域。Java語言的特點(diǎn):(1)簡(jiǎn)單:(2)面向?qū)ο螅?)分布性(4)解釋性(5)健壯性(6)安全性(7)可移植性(8)高性能(9)多線程(10)動(dòng)態(tài)性15.1.4Python一種公共域的,即譯式的,互動(dòng)的,面向?qū)ο蟮膭?dòng)態(tài)編程語言真正的免費(fèi)軟件,關(guān)于軟件的拷貝或者發(fā)布任何用Python開發(fā)的應(yīng)用程序沒有規(guī)則限制可以在包括Linux在內(nèi)的任何操作系統(tǒng)平臺(tái)上運(yùn)行目前使用的最流行的語言之一包含:模組式的操作,異常處理,動(dòng)態(tài)資料形態(tài)十分高層次的動(dòng)態(tài)資料結(jié)構(gòu),以及類別的使用簡(jiǎn)單的語法和強(qiáng)大的功能,語法表達(dá)優(yōu)美易讀Python語言的特點(diǎn):(1)開源軟件,有許多人為它編寫了數(shù)量眾多的模塊和庫,(2)被解釋器包裹的語言,使它可運(yùn)行在大部分的操作系統(tǒng)上。(3)良好的粘合語言,可調(diào)用C和Java編寫的庫。(4)語法單純(5)豐富的內(nèi)置數(shù)據(jù)類型(6)功能可以無限擴(kuò)展,這種擴(kuò)展是通過導(dǎo)入模塊來完成的(7)可移植度高15.1.5Ruby一種解釋型的方便快捷的面向?qū)ο竽_本語言適合文本文件處理和系統(tǒng)管理,并且完全面向?qū)ο蟆UZ法簡(jiǎn)單明快,可擴(kuò)展并且可跨平臺(tái)。完全自由開放原則:簡(jiǎn)單化的“最少驚喜”,Java的多線程和安全控制的功能,Tcl的容易擴(kuò)展的功能,PHP的嵌入功能和強(qiáng)大客戶端的功能,最方便的Shell命令的調(diào)用。Ruby語言的主要特點(diǎn):1.純的面向?qū)ο笳Z言2.解釋型腳本語言3.其他特點(diǎn):(1)動(dòng)態(tài)載入。(2)自動(dòng)內(nèi)存管理機(jī)制。(3)多精度整數(shù)。(4)迭代器和閉包。(5)開源項(xiàng)目。15.1.6Perl

PracticalExtractionandReportLanguageUNIX環(huán)境下編程高級(jí)語言的強(qiáng)大能力和靈活性不需要編譯器和鏈接器來運(yùn)行代碼Perl的特點(diǎn)特點(diǎn):有強(qiáng)大的字符串模式匹配,最好的文本文件的讀取和生成語言Unix系統(tǒng)管理者的好幫手具有很大的自由性接口:強(qiáng)大的數(shù)據(jù)庫接口和其它各種接口大量的程序庫(CPAN)缺點(diǎn):難讀懂,維護(hù)困難,不適合編寫大程序,只適合一千行以下的程序15.1.7PHP專門寫網(wǎng)頁程序的語言,語法和Perl極近可以嵌入HTML,更容易編寫服務(wù)器端程序動(dòng)態(tài)生成圖像簡(jiǎn)化了Perl語言傾向于所有的功能都用函數(shù)來解決以HTML為用戶界面,充當(dāng)各種服務(wù)器得客戶端,實(shí)現(xiàn)得是傳統(tǒng)得客戶端編程得任務(wù)15.2.1KDevelop簡(jiǎn)介基于KDE桌面環(huán)境的全能的開發(fā)環(huán)境,如圖1-1集編輯、編譯、調(diào)試等多種功能于一體內(nèi)嵌許多優(yōu)秀的第三方工具軟件用KDevelop開發(fā)軟件能自動(dòng)生成configure腳本及Makefile.in文件,無需編寫Makefile發(fā)出的軟件符合國際化要求,翻譯者可以很容易地將本地語言加入到項(xiàng)目中。網(wǎng)站:

15.2Linux集成開發(fā)環(huán)境圖15-1

KDevelop界面15.2.2Eclipse簡(jiǎn)介替代IBMVisualAgeforJava(以下簡(jiǎn)稱IVJ)的IDE開發(fā)環(huán)境,如圖1-2所示通過開發(fā)插件,能擴(kuò)展到任何語言的開發(fā),甚至能成為圖片繪制的工具。目前,Eclipse已經(jīng)開始提供C/C++開發(fā)的功能插件(CDT)Eclipse一個(gè)開放源代碼的項(xiàng)目可以通過開發(fā)新的插件擴(kuò)展現(xiàn)有插件的功能無限擴(kuò)展,而且有著統(tǒng)一的外觀,操作和系統(tǒng)資源管理Eclipse主要特性:方便的對(duì)源文件進(jìn)行導(dǎo)入和導(dǎo)出源代碼的管理更加隨心所欲支持團(tuán)隊(duì)開發(fā)支持插件開發(fā)網(wǎng)站:

圖15-2

Eclipse主界面15.2.3Emacs簡(jiǎn)介GNUEmacs由C語言與LISP語言寫成新發(fā)展的函數(shù)可以直接在Emacs中使用,不需重新編譯(complie)整個(gè)Emacs新增的函數(shù)也不會(huì)破壞Emacs原有的結(jié)構(gòu)公布的函數(shù),由FSF的審查,以決定是否要加入新版的Emacs中FSF鼓勵(lì)使用者將所發(fā)現(xiàn)的錯(cuò)誤,透過相同的管道,提供給FSF作為改進(jìn)之用不僅僅是一個(gè)編輯器,還是一個(gè)整合環(huán)境,或可稱它為集成開發(fā)環(huán)境,如圖15-3Emacs自行開發(fā)“bourne-shell-like”的shell:EShell收發(fā)電子郵件、通過FTP/TRAMP編輯遠(yuǎn)程檔案、通過Telnet登錄主機(jī)、上新聞組、登陸IRC和朋友交流、撰寫文章大綱、個(gè)人信息管理支持多種編程語言的編輯、調(diào)試程序,結(jié)合GDB,EDebug等。支持C/C++、Perl、Python、Lisp、Java等網(wǎng)站:/projects/emacs

圖15-3

GNUEmacs主界面15.3Linux編程風(fēng)格GNU編程風(fēng)格流行于Linux,廣泛應(yīng)用于Linux應(yīng)用軟件的編寫(1)函數(shù)的開頭的左花括號(hào)放到最左邊,避免把任何其它的左花括號(hào)、左括號(hào)或者左方括號(hào)放到最左邊。 函數(shù)定義:把函數(shù)名的起始字符放到最左邊也同樣重要15.3.1GNU風(fēng)格(2)盡力避免讓兩個(gè)不同優(yōu)先級(jí)的操作符出現(xiàn)在相同的對(duì)齊方式中。

(3)排版do-while語句:

(4)每個(gè)程序都應(yīng)該以一段簡(jiǎn)短地、說明其功能的注釋開頭。

(5)每個(gè)函數(shù)書寫注釋函數(shù)作用,需要哪些種類的參數(shù),參數(shù)可能值的含義以及用途。

如果它使用了任何非標(biāo)準(zhǔn)的東西,或者是可能導(dǎo)致函數(shù)不能工作的任何可能值,請(qǐng)確認(rèn)對(duì)它們進(jìn)行了說明。

如果存在重要的返回值,也需要對(duì)其進(jìn)行解釋。(6)不要在跨越了行的聲明中聲明多個(gè)變量。在每一行中都以一個(gè)新的聲明開頭。

如果它們是全局變量,在它們之中的每一個(gè)之前都應(yīng)該添加一條注釋。

(7)當(dāng)在一個(gè)if語句中嵌套了另一個(gè)if-else語句,總是用花括號(hào)把if-else括起來。

按照與then那部分代碼相同的縮進(jìn)方式縮進(jìn)elseif的then部分代碼,也可在花括號(hào)中把if嵌套

(8)要在同一個(gè)聲明中同時(shí)說明結(jié)構(gòu)標(biāo)識(shí)和變量或者結(jié)構(gòu)標(biāo)試和類型定義(typedef)。單獨(dú)地說明結(jié)構(gòu)標(biāo)試,而后用它定義變量或者定義類型。

(9)盡力避免在if的條件中進(jìn)行賦值。例如,不要寫:

(10)請(qǐng)?jiān)诿种惺褂孟聞澗€分隔單詞,堅(jiān)持使用小寫

把大寫字母留給宏和枚舉常量,以及根據(jù)統(tǒng)一的慣例使用的前綴。

(11)用于標(biāo)明一個(gè)命令行選項(xiàng)是否被給出的變量應(yīng)該在選項(xiàng)含義的說明之后,而不是選項(xiàng)字符之后,被命名。一條注釋即應(yīng)該說明選項(xiàng)的精確含義,還應(yīng)該說明選項(xiàng)的字母。

15.3.1Linux內(nèi)核風(fēng)格 K&R的標(biāo)準(zhǔn):Linux內(nèi)核的編程風(fēng)格。(1)縮進(jìn)格式是8個(gè)字符,使得程序易讀,能在你將程序變得嵌套層數(shù)太多的時(shí)候給警告(2)開始的大括號(hào)放在一行的最后,結(jié)束大括號(hào)放在一行的第一位,

(3)C是一種簡(jiǎn)潔的語言,命名也簡(jiǎn)潔

當(dāng)混合類型的名字不得不出現(xiàn)的時(shí)候,描述性名字對(duì)全局變量來說是必要的了。

(4)函數(shù)應(yīng)該短小而精悍

(5)注釋是一件很好的事情,但是過多的注釋也是危險(xiǎn)的

要試圖避免將注釋插在一個(gè)函數(shù)體里15.4課后習(xí)題與實(shí)驗(yàn)15.4.1課后習(xí)題簡(jiǎn)述Linux下軟件開發(fā)的特點(diǎn)。為什么在軟件開發(fā)中需要良好的編程風(fēng)格?15.4.2實(shí)驗(yàn):了解Linux編程

實(shí)驗(yàn)?zāi)康?/p>

了解Linux下編程實(shí)驗(yàn)內(nèi)容

選擇自己熟悉的一門語言,學(xué)習(xí) 關(guān)于這門語言在Linux環(huán)境下的使用。(包括編輯器、編譯器或者 集成開發(fā)環(huán)境的使用,如何使用該門語言進(jìn)行Linux下的軟 件開發(fā)等)完成實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)步驟: 見書本思考題

說明集成開發(fā)環(huán)境(IDE)與編輯 器、編譯器、連接器的區(qū)別。第六章Linux語言環(huán)境

⊙Shell的基本概念

⊙Shell編程基礎(chǔ)

⊙使用GNU工具進(jìn)行C/C++語言編程本章學(xué)習(xí)目標(biāo)16.1Shell編程

一個(gè)命令語言解釋器擁有內(nèi)建的命令集能被系統(tǒng)中其他的應(yīng)用程序所調(diào)用用戶在命令提示符下輸入的命令都由Shell解釋后傳遞給內(nèi)核16.1.1Shell基本概念Shell的概念用戶LinuxShell進(jìn)程命令計(jì)算機(jī)硬件Linux操作系統(tǒng)內(nèi)核系統(tǒng)調(diào)用輸出產(chǎn)生進(jìn)程圖16-1

Shell、用戶、內(nèi)核之間的關(guān)系命令分:包含在Shell內(nèi)部的,存在于文件系統(tǒng)中單獨(dú)的程序Shell接收到用戶輸入的命令

1。檢查命令是否為內(nèi)部的,若不是再檢查是否是一個(gè)應(yīng)用程序。

2。Shell在搜索路徑里尋找這些應(yīng)用程序。非內(nèi)部命令,不包含在搜索路徑里:顯示錯(cuò)誤信息能找到命令,該內(nèi)部程序或應(yīng)用程序?qū)⒈环纸鉃橄到y(tǒng)調(diào)用傳遞給Linux內(nèi)核。Shell一個(gè)解釋型的程序設(shè)計(jì)語言。Shell程序設(shè)計(jì)語言支持絕大多數(shù)在高級(jí)語言中能見到的程序元素。Shell編程語言簡(jiǎn)單易學(xué),任何在提示符下能鍵入的命令都能放到一個(gè)執(zhí)行的Shell程序中。Shell的種類Linux中的Shell有多個(gè)版本:BourneShell(sh)是Unix最初始的,在Shell編程方面相當(dāng)優(yōu)秀,但在處理與用戶交互方面做得不好。BourneAgainShell(bash)是sh的擴(kuò)展,與sh完全兼容,并且增加了許多特性,有靈活和強(qiáng)大的編程接口,同時(shí)又有很友好的用戶界面。CShell(csh)是一種比sh更適于編程的Shell,它的語法和C語言相似,但是并不和sh兼容。KornShell(ksh)集合了csh和sh的優(yōu)點(diǎn)并且和sh完全兼容。Bash優(yōu)點(diǎn):補(bǔ)全命令通配符歷史命令別名輸入/輸出重定向管道提示符作用控制

Shell腳本:用Shell提供的語法所編寫的腳本??梢詫⑦@些命令寫成腳本文件,以后只要運(yùn)行該腳本就可以了。Shell腳本的基本格式如圖16-2所示。創(chuàng)建和執(zhí)行Shell腳本#!/bin/bashecho“Dateandtimeis`date`”#end(1)文件以“#”開頭的行是注釋行。(2)echo命令用來顯示信息,反引號(hào)``用于命令置換,也就是將反引號(hào)中的字符串作為命令執(zhí)行,并輸出其結(jié)果。

在執(zhí)行腳本前,必須確定它是可執(zhí)行的。

chmod可以用來對(duì)一個(gè)腳本文件添加可執(zhí)行屬性。說明:變量:可存放數(shù)據(jù)的標(biāo)識(shí)符?!?”符號(hào)讀取變量的值。除了自定義變量外,還有一些系統(tǒng)默認(rèn)的特殊變量,這些變量也常常應(yīng)用到腳本中除了系統(tǒng)的常用變量外,還有一些變量是執(zhí)行Shell程序時(shí)系統(tǒng)設(shè)置變量,并且不能加以修改,這些變量也是相當(dāng)有用的

16.1.2Shell語法Shell變量變量功能#存儲(chǔ)Shell程序中命令行參數(shù)的個(gè)數(shù)?存儲(chǔ)上一個(gè)執(zhí)行命令的返回值0存儲(chǔ)Shell程序的程序名*存儲(chǔ)Shell程序的所有參數(shù)@存儲(chǔ)所有命令行輸入的參數(shù)$存儲(chǔ)Shell程序的PID!存儲(chǔ)上一個(gè)后臺(tái)執(zhí)行命令的PID表16-2 Shell程序執(zhí)行時(shí)變量“expr”命令:處理數(shù)值運(yùn)算命令后加上運(yùn)算表達(dá)式表達(dá)式由字符串及運(yùn)算符組成,每個(gè)字符串或運(yùn)算符間必須用空格隔開。說明:當(dāng)表達(dá)式中含有“*”、“(”、“)”等非字母或數(shù)字符號(hào)時(shí),必須在其前加上“\”,以免被Shell解釋成其他的意義。數(shù)值運(yùn)算命令“test”:在Bash中,用于計(jì)算一個(gè)條件表達(dá)式的值。在條件語句和循環(huán)語句中被用來判斷?!皌est”命令的語法格式:

testexpression或者[expression]在“test”命令中,可以使用很多Shell的內(nèi)部操作符。

測(cè)試命令操作符介紹:(1)字符串操作符,用于計(jì)算字符串表達(dá)式:·str1=str2,當(dāng)str1與str2相同時(shí),返回True。·str1!=str2,當(dāng)str1與str2不同時(shí),返回True?!tr,當(dāng)str不是空字符時(shí),返回True。·-nstr,當(dāng)str的長(zhǎng)度大于0時(shí),返回True·-zstr,當(dāng)str的長(zhǎng)度是0時(shí),返回True。(2)整數(shù)操作符具有和字符操作符類似的功能,只是它們的操作是針對(duì)整數(shù):·int1-eqint2,當(dāng)int1等于int2時(shí),返回True?!nt1-geint2,當(dāng)int1大于或等于int2時(shí),返回True?!nt1-leint2,當(dāng)int1小于或等于int2時(shí),返回True?!nt1-gtint2,當(dāng)int1大于int2時(shí),返回True?!nt1-neint2,當(dāng)int1不等于int2時(shí),返回True。(3)文件操作符,它們能檢查文件是否存在、文件類型等:·-dfile,當(dāng)file是一個(gè)目錄時(shí),返回True?!?ffile,當(dāng)file是一個(gè)普通文件時(shí),返回True?!?rfile,當(dāng)file是一個(gè)只讀文件時(shí),返回True。·-sfile,當(dāng)file文件長(zhǎng)度大于0時(shí),返回True?!?wfile,當(dāng)file是一個(gè)可寫文件時(shí),返回True?!?xfile,當(dāng)file是一個(gè)可執(zhí)行文件時(shí),返回True。(4)邏輯操作符用于修飾/連接包含整數(shù)、字符串、文件操作符的表達(dá):· !expr,當(dāng)expr的值是False時(shí),返回True?!?expr1-aexpr2,當(dāng)expr1、expr2值同為True時(shí),返回True?!?expr1-oexpr2,當(dāng)expr1、expr2的值至少有一個(gè)為True時(shí),返回True。條件結(jié)構(gòu)

(1)if語句if語句可根據(jù)表達(dá)式的值是真或假來決定要執(zhí)行的程序段落fi是if語句的結(jié)束符號(hào),必須與if成對(duì)出現(xiàn),而elif及else子句可有可無。elif是elseif的縮寫,當(dāng)if的表達(dá)式不成立時(shí),才會(huì)接著測(cè)試elif表達(dá)式。如果if及elif的測(cè)試條件都不成立,最后才會(huì)執(zhí)行else子句內(nèi)的命令。一個(gè)if語句可以包含好幾個(gè)elif子句,但只能包含一個(gè)else子句(2)case語句用來從很多的測(cè)試條件中選擇符合的條件執(zhí)行適用于字符串的比較,測(cè)試條件可以使用通配符。雙分好(;;)為測(cè)試條件的結(jié)束。在每個(gè)測(cè)試條件成立后,一直到雙分號(hào)之前的命令都會(huì)被Shell執(zhí)行。使用通配符時(shí),不要在字符串左右加雙引號(hào)。由于所有字符串都可與通配符“*”匹配,所以“*”之后的命令可以看作是case語句的默認(rèn)執(zhí)行命令(3)

for語句

for語句有兩種語法:第一種:

forvarinlist //對(duì)list中的每一個(gè)元素

do commands //執(zhí)行這些操作

done //循環(huán)結(jié)束 在使用此形式時(shí),對(duì)在list中的每一項(xiàng),for語句都執(zhí)行一次。List可以是包含幾個(gè)單詞并且有空格分隔開的變量,也可以是直接輸入的幾個(gè)值。每執(zhí)行一次循環(huán),var都被賦予list中的當(dāng)前值,直到最后一個(gè)為止。for語句的in子句和case子句相同,都可以使用通配符。

循環(huán)結(jié)構(gòu)第二種:

forvar do commands //對(duì)每一個(gè)命令行參數(shù)執(zhí)行這些操作

done

使用這種形式時(shí),Shell程序假定var包含Shell程序在命令行的所有位置的參數(shù),對(duì)var中的每一項(xiàng),for語句都執(zhí)行一次。

(4)while與until語句

while與until的語法結(jié)構(gòu)和用途類似。While語句在測(cè)試條件為真時(shí)循環(huán)執(zhí)行

until語句會(huì)在測(cè)試條件為假時(shí)循環(huán)執(zhí)行

(5)shift語句shift命令用來將命令行參數(shù)左移。shift命令也可以指定參數(shù)左移的位數(shù),Shift命令常與while語句或until語句一起使用。(6)break和continue語句

在Shell的for、while、until循環(huán)語句中也可以使用如C語言的break和continue語句以跳離當(dāng)前循環(huán)。Break語句:用于中斷循環(huán)的執(zhí)行,將程序流程轉(zhuǎn)移至循環(huán)外。continue語句:則忽略之后的命令,將程序流程轉(zhuǎn)移至循環(huán)開始處。break和continue語句后都可以加上數(shù)字,表示要跳出的循環(huán)數(shù)目。若指定的數(shù)字大于最大的循環(huán)層數(shù),就跳至最外層循環(huán)執(zhí)行,若只跳離一層,數(shù)字可以省略。

函數(shù)的定義和使用Shell的腳本也有函數(shù)的功能。當(dāng)腳本變的很大時(shí),可以將腳本文件中常用的程序?qū)懗珊瘮?shù)的形式,這樣可以使腳本更容易維護(hù),同時(shí)結(jié)構(gòu)更加嚴(yán)謹(jǐn)函數(shù)的使用方法與外部命令一樣,只要直接使用函數(shù)名就可以了。在使用函數(shù)時(shí),一樣可以傳入?yún)?shù)。函數(shù)處理參數(shù)的方式與腳本文件處理命令行參數(shù)的方法是一樣的。在函數(shù)中,$1是指?jìng)魅牒瘮?shù)的第一個(gè)參數(shù),$2是指?jìng)魅牒瘮?shù)的第二個(gè)參數(shù)。同時(shí)也可以使用shift命令來移動(dòng)函數(shù)的參數(shù)。顯示壓縮文件的內(nèi)容。#!/bin/bashecho–n“Displayingcontentsof$1”if[${1##*.}=tar]then echo“(uncompressedtar)” tartvf$1elif[${1##*.}=gz]then echo“(gzip-compressedtar)” tartzvf$1elif[${1##*.}=bz2]then echo“(bzip2-compressedtar)” cat$1|bzip2–d|tartvf–fi#end16.1.3Shell編程示例示例一在指定文件中查找特定單詞。#!/bin/bashiftest$#-ne2then echo“Invalidargument!”else filename=$1 word=$2 ifgrep$word$filename>/tmp/temp then echo“Thewordwasfound!” else echo“Thewordwasnotfound!” fifi#end示例二查找用戶是否登錄,若已登錄,輸出該用戶的信息。#!/bin/bashecho“Typeintheusername.”readuserif grep$user/etc/passwd>/tmp/null who|grep$userthen echo“$userhasloggedinthesystem.” cat/tmp/nullelse echo“$userhasnotloggedinthesystem.”fi#end示例三GCC:GNUCompilerCollection的簡(jiǎn)稱,有時(shí)也叫GNUCC。能把易于人類使用的高級(jí)語言編寫的源代碼構(gòu)建成計(jì)算機(jī)能夠直接執(zhí)行的二進(jìn)制代碼。GCC是Linux平臺(tái)下最常用的編譯程序,它是Linux平臺(tái)編譯器的事實(shí)標(biāo)準(zhǔn)。在Linux平臺(tái)下的嵌入式開發(fā)領(lǐng)域,GCC也是用得最普遍的一種編譯器。16.2C/C++語言編程16.2.1GCCGCC簡(jiǎn)介GCC支持的體系結(jié)構(gòu)有四十余種。能運(yùn)行在不同的操作系統(tǒng)上,還支持多種語言。對(duì)于C語言,GCC中的編譯器是gcc,而對(duì)于C++,GCC中的編譯器是gcc和g++。程序的編譯過程

對(duì)于GNU編譯器來說,程序的編譯要經(jīng)歷預(yù)處理、編譯、匯編、連接四個(gè)階段,如圖16-3所示。從功能上分,預(yù)處理、編譯、匯編是三個(gè)不同的階段,但GCC的實(shí)際操作上,它可以把這三個(gè)步驟合并為一個(gè)步驟來執(zhí)行。

gcc的常用模式

編譯模式和編譯連接模式。gcc常用選項(xiàng)編譯C++在GNUCC中,編譯C++有兩個(gè)工具,gcc和g++。16.2.2GNUmake

GNUmake:Linux專門為軟件開發(fā)提供的自動(dòng)化管理工具??梢苑奖愕毓芾碥浖幾g的內(nèi)容、方式和時(shí)機(jī)。make將整個(gè)軟件項(xiàng)目的代碼分開放在幾個(gè)小的源文件里,在改動(dòng)其中一個(gè)文件的時(shí)候,可以只對(duì)該文件重新進(jìn)行編譯,然后重新連接所有的目標(biāo)文件。GNUmake簡(jiǎn)介

Makefile

程序員通過定義構(gòu)建規(guī)則來控制代碼的創(chuàng)建過程。這些規(guī)則通常定義在一個(gè)名為Makefile的文件中。Makefile中的每條規(guī)則事實(shí)上都包含如下一些內(nèi)容:目標(biāo)(target)是make最終需要?jiǎng)?chuàng)建的對(duì)象;依賴(dependency)通常是一個(gè)列表,指明編譯目標(biāo)時(shí)需要用到的其它文件;命令(command)也是一個(gè)列表,指明從依賴文件創(chuàng)建出目標(biāo)對(duì)象所需要執(zhí)行的命令。

變量

引入了變量,簡(jiǎn)化Makefile的編寫。變量:為文本串在Makefile中定義一個(gè)便于記憶的名稱。變量的定義和應(yīng)用與Linux的環(huán)境變量一樣,變量名大寫,變量一旦定義之后,就可以通過將變量名用圓括號(hào)包起來,并在前面加上“$”符號(hào)來進(jìn)行引用。變量一般都在Makefile的頭部定義。如果變量的值發(fā)生了改變,很顯然只需在一個(gè)地方進(jìn)行修改就可以了,從而大大簡(jiǎn)化了Makefile的維護(hù)。偽目標(biāo)

在Makefile中,并不是所有的目標(biāo)都對(duì)應(yīng)于磁盤上的文件。有的目標(biāo)存在只是為了形成一條規(guī)則,從而完成特定的工作,并不生成新的目標(biāo)文件,這樣的目標(biāo)稱為偽目標(biāo)。在已經(jīng)給出的Makefile文件中,最后一個(gè)目標(biāo)clean就是偽目標(biāo)。它規(guī)定了make應(yīng)該執(zhí)行的命令。隱式規(guī)則

除了可以在Makefile中明確指定規(guī)則(顯示規(guī)則)之外,make還維護(hù)了一整套隱式規(guī)則。

隱式規(guī)則可以在用戶沒有完整地給出某些命令的時(shí)候,自動(dòng)執(zhí)行恰當(dāng)?shù)牟僮鳌k[式規(guī)則最大的好處是可以簡(jiǎn)化Makefile的編寫和維護(hù)16.2.3調(diào)試工具GDB

GNU的調(diào)試器稱為GDB,該程序是一個(gè)交互式工具,工作在字符模式。GDB是功能強(qiáng)大的調(diào)試程序,可完成如下的調(diào)試任務(wù): 設(shè)置斷點(diǎn) 監(jiān)視程序變量的值 程序的單步執(zhí)行 修改變量的值GDB介紹

常用GDB命令

命令描述file裝入想要調(diào)試的可執(zhí)行文件kill終止正在調(diào)試的程序list列出產(chǎn)生執(zhí)行文件的源代碼的一部分next執(zhí)行一行源代碼但不進(jìn)入函數(shù)內(nèi)部step執(zhí)行一行源代碼而且進(jìn)入函數(shù)內(nèi)部run執(zhí)行當(dāng)前被調(diào)試的程序quit終止GDBwatch使用戶能監(jiān)視一個(gè)變量的值而不管它何時(shí)被改變break在代碼里設(shè)置斷點(diǎn),這將使程序執(zhí)行到這里時(shí)被掛起make使用戶能不退出GDB就可以重新產(chǎn)生可執(zhí)行文件shell使用戶能不離開GDB就執(zhí)行UNIXshell命令GDB使用范例

以下是一個(gè)有錯(cuò)誤的C語言源程序test.c:#include<stdio.h>#include<stdlib.h>staticcharbuff[256];staticchar*string;intmain(){printf("Pleaseinputastring:");gets(string);printf("Yourstringis:%s",string);}利用GDB查找該程序中出現(xiàn)的問題,并按如下的步驟進(jìn)行:運(yùn)行g(shù)dbtest命令,裝入test可執(zhí)行文件。執(zhí)行裝入的test命令。使用where命令查看程序出錯(cuò)的地方。利用list命令查看調(diào)用gets函數(shù)附近的代碼。唯一能夠?qū)е耮ets函數(shù)出錯(cuò)的因素就是變量string,用print命令查看string的值。在GDB中,我們可以直接修改變量的值,只要將string取一個(gè)合法的指針值就可以了,為此,我們?cè)诘?1行處設(shè)置斷點(diǎn)。程序重新運(yùn)行到第11行處停止,這時(shí),我們可以用setvariable命令修改string的取值。然后繼續(xù)運(yùn)行,將看到正確的程序運(yùn)行結(jié)果16.3課后習(xí)題與實(shí)驗(yàn)

什么是Shell?RedHatLinux9默認(rèn)的是哪一種Shell?Shell的主要功能是什么?主要執(zhí)行方式有哪些?Shell的變量有哪些?如何實(shí)現(xiàn)對(duì)變量的賦值及引用?command1&&command2||command3的含義是什么?分析下面一段Shell腳本的功能:

count=$# cmd=echo while[$count–gt0] do cmd=”$cmd\$$count” letcount=$count–1 done16.3.1課后習(xí)題6. 編寫一個(gè)Shell腳本,顯示當(dāng)天日期,查找給定的某用戶是否已經(jīng)登錄到系統(tǒng),若已經(jīng)登錄,則發(fā)送問候給該用戶。7. 編寫一個(gè)Shell腳本,求斐波那契數(shù)列的第10項(xiàng),及其前10項(xiàng)總和。8. 編寫一個(gè)C語言程序,在屏幕上顯示“hello,world!”。16.3.2實(shí)驗(yàn):Shell及C編程

實(shí)驗(yàn)?zāi)康恼莆誏inux下Shell腳本的編寫及GNUCC工具的使用實(shí)驗(yàn)內(nèi)容設(shè)計(jì)一個(gè)Shell程序,在每月第一天備份并壓縮/etc目錄的所有內(nèi)容,存放在/$HOME目錄里,且文件名為如下形式y(tǒng)ymmdd_etc,yy為年,mm為月,dd為日。Shell程序fileback存放在/$HOME目錄下。設(shè)計(jì)一個(gè)Shell程序,在/$HOME/userdata目錄下建立50個(gè)目錄,即user1~user50,并設(shè)置每個(gè)目錄的權(quán)限,其中其他用戶的權(quán)限為:讀;文件所有者的權(quán)限為:讀、寫、執(zhí)行;文件所有者所在組的權(quán)限為:讀、執(zhí)行。編寫一個(gè)C語言程序,對(duì)一個(gè)數(shù)組實(shí)現(xiàn)冒泡排序。sort.c:包含冒泡排序的函數(shù);main.c:加載sort.c,并實(shí)現(xiàn)主函數(shù)用來測(cè)試排序函數(shù);編寫makefile,并使用make對(duì)該程序進(jìn)行編譯連接完成實(shí)驗(yàn)報(bào)告思考題嘗試使用gdb進(jìn)行調(diào)試,在調(diào)試過程中,記錄下每一次排序循環(huán)后數(shù)組的變化。嘗試使用makefile的特性(如定義變量、偽目標(biāo)、隱式規(guī)則等)使實(shí)驗(yàn)要求編寫的makefile更具通用性第十七章Linux內(nèi)核概述

本章學(xué)習(xí)目標(biāo)⊙ 內(nèi)核的基本概念⊙ 可加載模塊的概念17.1內(nèi)核簡(jiǎn)介

“內(nèi)核”:操作系統(tǒng)的核心一個(gè)提供硬件抽象層、磁盤及文件系統(tǒng)控制、多任務(wù)等功能的系統(tǒng)軟件。Linus開發(fā)的Linux僅是一個(gè)內(nèi)核,并不是一個(gè)完整的操作系統(tǒng)。Linux內(nèi)核不是現(xiàn)代操作系統(tǒng)所崇尚的微內(nèi)核結(jié)構(gòu),而是一體化內(nèi)核系統(tǒng),整個(gè)內(nèi)核就是一個(gè)單獨(dú)的系統(tǒng)程序。從實(shí)現(xiàn)機(jī)制看,Linux分為五個(gè)子系統(tǒng):進(jìn)程調(diào)度、內(nèi)存管理、虛擬文件系統(tǒng)、網(wǎng)絡(luò)接口、進(jìn)程間通信。17.1.1內(nèi)核結(jié)構(gòu)介紹17.1.2內(nèi)核版本

Linux內(nèi)核的版本編號(hào)系統(tǒng)是這里要重點(diǎn)介紹的。從Linux1.0這個(gè)里程碑式的系統(tǒng)開始,使用了兩“路”編號(hào)方法標(biāo)注內(nèi)核的開發(fā)。偶數(shù)號(hào)的內(nèi)核(比如1.0、2.2、2.4)是“穩(wěn)定階段的”內(nèi)核,表示對(duì)內(nèi)核只有少量的修改,這些修改不影響內(nèi)核的穩(wěn)定性,只是為了修正一些bug或優(yōu)化效率等。奇數(shù)號(hào)的內(nèi)核版本(1.1、2.3)是前沿的或者“開發(fā)階段的”內(nèi)核,表示對(duì)內(nèi)核特性有所增加17.1.3內(nèi)核配置及編譯

Linux作為一個(gè)自由軟件,在廣大愛好者的支持下,內(nèi)核版本不斷更新。新的內(nèi)核修訂了舊內(nèi)核的bug,并增加了許多新的特性。如果用戶想要使用這些新特性,或想根據(jù)自己的系統(tǒng)度身定制一個(gè)更高效,更穩(wěn)定的內(nèi)核,就需要重新編譯內(nèi)核為什么重新配置及編譯內(nèi)核內(nèi)核編譯模式

要增加對(duì)某部分功能的支持,也可把該部分編譯成模塊(module),動(dòng)態(tài)調(diào)用。編譯到內(nèi)核中,在內(nèi)核啟動(dòng)時(shí)可以自動(dòng)支持相應(yīng)部分的功能優(yōu)點(diǎn)是方便、速度快,機(jī)器一啟動(dòng),你就可以使用這部分功能了缺點(diǎn)是會(huì)使內(nèi)核變得龐大起來如果編譯成模塊,就會(huì)生成對(duì)應(yīng)的.o文件,在使用的時(shí)候可以動(dòng)態(tài)加載優(yōu)點(diǎn)是不會(huì)使內(nèi)核過分龐大缺點(diǎn)是你得自己來調(diào)用這些模塊配置及編譯內(nèi)核[root@localhostboot]#ln-svmlinuz-vmlinuz[root@localhostboot]#ln-sSystem.map-System.map//以上命令為安裝編譯好的新內(nèi)核//然后修改grub.conf,將新內(nèi)核配置到啟動(dòng)菜單后,內(nèi)核的安裝就完成了。//從Linux內(nèi)核版本發(fā)布的官方網(wǎng)站()下載最新的穩(wěn)定版內(nèi)核//當(dāng)前為linux-.tar.bz2。//將下載的新內(nèi)核放入/usr/src目錄。[root@localhostdownload]#cplinux-.tar.bz2/usr/src//解壓新內(nèi)核[root@localhostdownload]#cd/usr/src[root@localhostsrc]#tarjxvflinux-.tar.bz2[root@localhostsrc]#cdlinux-//開始編譯內(nèi)核之旅[root@localhostlinux-]#makemrproper//以上命令確保源代碼目錄下沒有不正確的.o文件以及文件的互相依賴。[root@localhostlinux-]#makemenuconfig//以上命令進(jìn)行內(nèi)核的配置,一共有三種配置選項(xiàng)://Y:將該功能編譯進(jìn)內(nèi)核;//N:不將該功能編譯進(jìn)內(nèi)核;//M:將該功能編譯成可以在需要時(shí)動(dòng)態(tài)插入到內(nèi)核中的模塊。//配置完后,存盤退出。[root@localhostlinux-]#makedep//以上命令確保關(guān)鍵文件在正確的位置[root@localhostlinux-]#makeclean//以上命令確保所有有關(guān)文件都處于最新版本狀態(tài)[root@localhostlinux-]#makezImage/bzImage//以上命令編譯壓縮形式的內(nèi)核//zImage:普通方式編譯內(nèi)核//bzImage:需要內(nèi)核支持較多的外設(shè)和功能時(shí),內(nèi)核可能變得很大,此時(shí)可以編譯大內(nèi)核[root@localhostlinux-]#makemodule//以上命令編譯選擇的模塊[root@localhostlinux-]#makemodule_install//以上命令將編譯后的模塊轉(zhuǎn)移到系統(tǒng)標(biāo)準(zhǔn)位置[root@localhostlinux-]#cpSystem.map/boot/System.map-[root@localhostlinux-]#cparch/i386/bzImage/boot/vmlinuz-[root@localhostlinux-]#cd/boot;rm-fSystem.mapvmlinuz17.1.4內(nèi)核補(bǔ)丁安裝

補(bǔ)丁文件比完整的內(nèi)核文件要小得多,下載起來比較方便。但補(bǔ)丁文件只能對(duì)前一個(gè)版本進(jìn)行升級(jí)。例如:假定當(dāng)前內(nèi)核版本為,需要下載的補(bǔ)丁文件為patch-.bz2。

patch程序用來對(duì)內(nèi)核源文件進(jìn)行一系列的修改:〖示例17.1〗[root@localhostdownload]#bzip2–dpatch-.bz2[root@localhostdownload]#cppatch-/usr/src/linux[root@localhostdownload]#cd/usr/src/linux[root@localhostlinux]#patch–p1<patch-將當(dāng)前內(nèi)核版本升級(jí)成。17.2可加載模塊

動(dòng)態(tài)可加載模塊好處:讓內(nèi)核保持很小的尺寸同時(shí)非常靈活無需重構(gòu)內(nèi)核并頻繁重新啟動(dòng)來嘗試運(yùn)行新內(nèi)核代碼盡管使用模塊很自由,但是也有可能同時(shí)帶來與核心模塊相關(guān)的性能與內(nèi)存損失??杉虞d模塊的代碼一般有些長(zhǎng)并且額外的數(shù)據(jù)結(jié)構(gòu)可能會(huì)占據(jù)一些內(nèi)存。對(duì)內(nèi)核資源的間接使用可能帶來一些效率問題17.2.1可加載模塊概述17.2.2模塊工具

模塊的命令:使用lsmod來查看內(nèi)核中當(dāng)前的模塊使用modprobe來加載核心模塊使用rmmod來卸載模塊核心自身可請(qǐng)求核心后臺(tái)進(jìn)程kerneld來加載與卸載模塊lsmod

說明:列出目前系統(tǒng)中已加載的模塊的名稱及大小等可以查看/proc/modules,知道系統(tǒng)已經(jīng)加載的模塊。[root@localhostroot]#lsmodModuleSizeUsedby

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論