版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
Linux編程及應用
郵箱:1參考教材:
linux軟件工程師(C語言)實用教程劉加海,張益先主編科學出版社《UNIX環(huán)境高級編程》(第2版),史蒂文斯著Linux高級程序設計:(英)美斯特,(美)布盧著,陳健等譯人民郵電出版社2課程要求:作業(yè)和平時表現(xiàn):20%
上機實驗:20%
期末考試:60%3課程內(nèi)容:Shell編程Linux系統(tǒng)程序設計基礎文件分割和多文件編譯linux環(huán)境下系統(tǒng)函數(shù)的使用文件的操作串行通信進程控制進程間的通信網(wǎng)絡程序設計4第一章Shell編程5本章學習目標了解shell編程的基本概念及其特點掌握shell各種變量的區(qū)別掌握正則表達式的使用方法熟悉shell的各種流程控制了解shell的函數(shù)6*目錄1.1Shell概述1.2創(chuàng)建和執(zhí)行shell程序1.3變量1.4位置參數(shù)1.5特殊字符1.6運算符1.7輸入和輸出1.8表達式的比較1.9流程控制語句1.10函數(shù)7*1.1Shell概述Shell就像一個殼層,這個殼層介于用戶和操作系統(tǒng)之間,負責將用戶的命令解釋為操作系統(tǒng)可以接收的低級語言,并將操作系統(tǒng)響應的信息以用戶可以了解的方式來顯示。硬件操作系統(tǒng)KernelShell8*1.1Shell概述Shell角色圖Shell操作系統(tǒng)kernel硬件9*1.1Shell概述從用戶登陸到注銷期間,用戶輸入的每個命令都會經(jīng)過解譯及執(zhí)行,其負責機制就是shell。shell是一個命令語言解釋器,它擁有自己內(nèi)建的shell命令集,shell也能被系統(tǒng)中其他應用程序所調(diào)用。用戶在提示符下輸入的命令都由shell先解釋然后傳給Linux核心。有一些命令,如改變工作目錄命令cd,是shell內(nèi)置命令。還有一些命令,例如拷貝命令cp和移動命令mv,是存在于文件系統(tǒng)中某個目錄下的單獨的程序。對用戶而言,不必關心一個命令是建立在shell內(nèi)部還是一個單獨的程序。
10*1.1Shell概述shell的主要版本在Linux系統(tǒng)中常見的shell版本有以下幾種。(1)Bourneshell(sh):它是UNIX最初使用的shell,并且在每種UNIX都可以使用。它在shell編程方面相當優(yōu)秀,但處理與用戶的交互方面不如其他幾種shell。(2)Cshell(csh):它最初由BillJoy編寫,它更多地考慮了用戶界面的友好性,支持如命令補齊等一些Bourneshell所不支持的特性,但其編程接口做得不如Bourneshell。Cshell被很多C程序員使用,因為Cshell的語法和C語言的很相似,Cshell也由此得名。(3)Kornshell(ksh):它集合了Cshell和Bourneshell的優(yōu)點,并且和Bourneshell完全兼容。11*1.1Shell概述(4)BourneAgainshell(bash):bash是大多數(shù)Linux系統(tǒng)的默認shell。它是Bourneshell的擴展,并與Bourneshell完全向后兼容,而且在Bourneshell的基礎上增加和增強了很多特性。。(5)tcsh:它是Cshell的一個擴展版本,與csh完全向后兼容,但它包含了更多使用戶感覺方便的新特性,其最大的提高是在命令行編輯和歷史瀏覽方面。它不僅和Bashshell提示符兼容,而且還提供比Bashshell更多的提示符參數(shù)。(6)pdksh:它是一個專門為Linux系統(tǒng)編寫的Kornshell(ksh)的擴展版本。Ksh是一個商用shell,不能免費提供,而pdksh是免費的。12*表1Linux中的各種shellshell名稱描述位置
ash一個小shell(和sh類似)/bin/ashash.static一個不依靠軟件庫的ash版本/bin/ash.staticbashBourneAgainShell/bin/bashbash2BourneAgainShell的新版本/bin/bash2bshash的一個符號鏈接/bin/bshcshCshell,tcsh的一個符號鏈接/bin/cshksh公共域受限制的shell(針對網(wǎng)絡操作)/usr/bin/kshshbash的一個符號鏈接/bin/shtcsh和csh兼容的shell/bin/tcshzsh一個和csh,ksh和sh兼容的shell/bin/zsh1.1Shell概述13*1.1Shell概述判斷登入shell使用echo命令來查詢系統(tǒng)的“SHELL”環(huán)境變量,命令如下:#echo$SHELL14*1.1Shell概述暫時變更shell除非是在受限的shell中,否則若要變更使用shell,只要執(zhí)行該Shell程序名稱(shell_name),即可切換到不同的Shell。如:#sh(或#csh等等)此處的shell_name是指shell的名稱(例如,sh或csh)。暫時變更shell,可在其它的shell中進行試驗。鍵入exit或CTRL-D可以回到原始的shell中。15*1.1Shell概述16*1.1Shell概述Shell功能介紹交互式處理(InteractiveProcessing)接收來自用戶輸入的命令后,shell會根據(jù)命令類型的不同來執(zhí)行,執(zhí)行完畢后,shell會將結果回傳給用戶,并等待用戶下一次輸入。用戶執(zhí)行exit或是按Ctrl+D來注銷shell才會結束。17*1.1Shell概述命令補全功能指用戶輸入命令后,有時不需輸入完整的命令,而系統(tǒng)會自動找出最符合的命令名稱,這種功能可以節(jié)省輸入長串命令的時間。不需要輸入完整的文件名,只需輸入開頭幾個字母,然后按Tab鍵時候,系統(tǒng)會補充完整,連續(xù)按兩次Tab(Esc)鍵系統(tǒng)會顯示所有符合輸入前綴的文件名稱。若忘了命令的全名,而只記得命令的開頭字母,按Tab鍵一次會補充完整,連續(xù)按兩次Tab(Esc)鍵系統(tǒng)會顯示所有符合輸入前綴的命令名稱。18*1.1Shell概述查閱歷史記錄-h(huán)istory命令在Linux系統(tǒng)上輸入命令并按下Enter后,這個命令就會存放在命令記錄表(~/.bash_history)中,預定的記錄為1000筆,這些都定義在環(huán)境變量中。列出所有的歷史記錄:#history只列出最近5筆記錄犯例:#history5使用命令記錄號碼執(zhí)行命令:#!561重復執(zhí)行上一個命令:#!!執(zhí)行最后一次以ls開頭的命令:#!ls19*1.1Shell概述別名(Alias)功能查詢目前系統(tǒng)所有別名:#alias設置別名:#aliasdir=‘ls-l’使用別名:#dir/etc取消別名:#unaliasdiralias命令的效力僅限于該次登錄,在注銷系統(tǒng)后,這個別名的定義就會消失。如果希望每次登陸都使用這些別名,則應該將別名的設置加入“~/.bashrc”文件中,若是寫入“/etc/bashrc”文件中,則系統(tǒng)上的所有用戶都能使用這個別名。20*1.2創(chuàng)建和執(zhí)行shell程序不同的shell其編程(命令)語法有所不同較常見的shell腳本是bash另一種較常見的shell腳本是tcsh,其命令/語法類似C語言學習腳本編程的原因在有些場合,希望一些常用的命令集能用一個命令實現(xiàn);可以處理一些特定的問題,如計算每月上網(wǎng)的總時數(shù)。21*1.2創(chuàng)建和執(zhí)行shell程序Shell腳本編程前的準備文本編輯器(vi或vim,gedit等)腳本解釋程序(bash,tcsh等)其他工具(用來擴充Shell腳本的功能,如:grep,wc)22*1.2創(chuàng)建和執(zhí)行shell程序例:顯示當前的日期時間、執(zhí)行路徑、用戶賬號及所在的目錄位置。1.建立shell腳本如建立一個名為ex1的shell腳本,可提示符后輸入命令:$viex1.sh23*1.2創(chuàng)建和執(zhí)行shell程序在vi編輯器中輸入下列內(nèi)容:
#!/bin/bash#Thisscriptisatest!echo–n“Dateandtimeis:”dateecho–n“Theexecutablepathis:”$PATHecho“Yournameis:`whoami`”echo-n“Yourcurrentdirectoryis:”pwd#end2.用三種方法執(zhí)行shell腳本24*1.2創(chuàng)建和執(zhí)行shell程序(1)輸入定向到shell腳本。其一般形式是:$bash<腳本名例如:$bash<ex1(2)以腳本名作為參數(shù)。其一般形式為:$bash腳本名[參數(shù)]例如:$bashex1如果以當前shell執(zhí)行一個shell腳本,則可以使用如下簡便形式:$.腳本名[參數(shù)](3)使用chmod命令將shell腳本的權限設置為可執(zhí)行,然后在提示符下直接執(zhí)行它。例如:
$chmoda+xex1$./ex125*1.2創(chuàng)建和執(zhí)行shell程序在編寫shell時,第一行一定要指明系統(tǒng)需要那種shell解釋你的shell程序,如:#!/bin/bash,#!/bin/csh,/bin/tcsh,還是#!/bin/pdksh。用上面執(zhí)行shell腳本的三種方法分別體會這句話的作用。26*1.3變量3種類型:環(huán)境變量:系統(tǒng)提供,不用定義,可以修改內(nèi)部變量:系統(tǒng)提供,不用定義,不能修改用戶變量:用戶定義,可以修改與其他語言的區(qū)別:非類型性質(zhì),也就是不必指定變量是數(shù)字或字符串等。27*1.3變量環(huán)境變量Linux環(huán)境(也稱為shell環(huán)境)由許多變量及這些變量的值組成,由這些變量和變量的值決定環(huán)境外觀。這些變量就是環(huán)境變量。主要環(huán)境變量的有:(1)HOME:用戶目錄的全路徑名。(2)UID當前用戶的識別字,取值是由數(shù)位構成的字串。(3)LOGNAME:即用戶的注冊名,由Linux自動設置。(4)MAIL:用戶的系統(tǒng)信箱的路徑。(5)PATH:shell從中查找命令的目錄列表。28*1.3變量(6)PS1:shell的主提示符,在特權用戶下,默認的主提示符是#,在普通用戶下,默認的主提示符是$。(7)PS2:在Shell接收用戶輸入命令的過程中,如果用戶在輸入行的末尾輸入“\”然后回車,或者當用戶按回車鍵時Shell判斷出用戶輸入的命令沒有結束時,就顯示這個輔助提示符,提示用戶繼續(xù)輸入命令的其余部分,默認的輔助提示符是>。(8)PWD:用戶當前工作目錄的絕對路徑名,該變量的取值隨cd命令的使用而變化。它指出用戶目前在Linux文件系統(tǒng)中處在什么位置。它是由Linux自動設置的。(9)SHELL:用戶當前使用的shell。它也指出你的shell解釋程序放在什么地方。(10)TERM:用戶終端類型。29*1.3變量$HOME/.bash_profile(/etc/profile)env30*1.3變量export在任何時候,創(chuàng)建的變量都只是當前Shell的局部變量,不能被Shell運行的其他命令或Shell程序所用,export命令可以將一個局部變量提供給Shell執(zhí)行的其他命令使用。31*1.3變量內(nèi)部變量(預定義變量)內(nèi)部變量是Linux所提供的一種特殊類型的變量,這類變量在程序中用來作出判斷。在shell程序內(nèi)這類變量的值是不能修改的。部分內(nèi)部變量是:$#——傳送給shell程序的位置參數(shù)的個數(shù)$?——命令執(zhí)行后返回的狀態(tài)$0——當前執(zhí)行的進程的名稱$*——調(diào)用shell程序時所傳送的全部參數(shù)成的單字符串32*1.3變量ex1.sh的示范例子:
#ex9_3_1.shecho“Numberofparametersis”$#echo“Programnameis”$0echo“Parametersasasinglestringis”$*
在bash中,從命令行中執(zhí)行ex9_3_1.sh如下:
#.ex9_3_1.shzhangli
將得到如下的結果:33*1.3變量用戶變量1.變量名用戶定義的變量是最普通的shell變量。變量名是以字母或下線符開頭的字母、數(shù)字和下線符序列,并且大小寫字母意義不同。在定義變量時,變量名前不應加符號$,在引用變量的內(nèi)容時則應在變量名前加$;在給變量賦值時,等號兩邊一定不能留空格,若變量中本身就包含了空格,則整個字串都要用雙引號括起來。在編寫Shell程序時,為了使變量名和命令名相區(qū)別,建議所有的變量名都用大寫字母來表示。34*1.3變量2.變量賦值給變量賦值的過程也是聲明一個變量的過程。set顯示本地所有的變量變量的賦值很簡單,其一般形式是:變量名=字符串/數(shù)字例如:lcount=0myname=fedora有時想在說明一個變量并對它設置為一個特定值后就不在改變它的值時,可以用下面的命令來保證一個變量的只讀性:readonly
變量名35*1.3變量36*1.3變量37*1.3變量3.訪問變量值可以通過給變量名加上前綴$(美元符)來訪問變量的值。例如:如果要把myname的值分配給變量yourname,那么可以執(zhí)行下面的命令:yourname=$myname38*1.3變量4.變量清除unsetvariable-name例:39*1.3變量給變量賦值
命令環(huán)境locunt=0pdksh和bashsetlocunt=0tcshmyname=Sanjivpdksh和bashsetname=Sanjivtcshmyname=’SanjivGuha’pdksh和bashsetname=’SanjivGuha’tcsh40*1.3變量給變量賦值訪問變量值
命令環(huán)境lcount=$varpdksh和bashsetlcount=$vartcsh41*1.4位置參數(shù)1.位置參數(shù)及引用可以編寫一個shell腳本,當從命令行或者從其他shell腳本中調(diào)用它的時候,這個腳本接收若干參數(shù)。這些選項是通過Linux作為位置參數(shù)(positionalparameter)提供給shell程序的。在shell腳本中應有變量,接收實參,這類變量的名稱很特別,分別是1,2,3,…,這類變量稱為位置變量。位置參數(shù)1存放在位置變量1中,位置參數(shù)2存放位置變量2中,……,在程序中可以使用$1,$2,……來訪問。42*1.4位置參數(shù)2.用set命令為位置參數(shù)賦值在shell程序中可以利用set命令為位置參數(shù)賦值或重新賦值。(1)一般格式:set[參數(shù)表](2)說明:該命令后面無參數(shù)時,將顯示系統(tǒng)中的系統(tǒng)變量的值;如果有參數(shù)將分別給位置參數(shù)賦值。43*1.4位置參數(shù)3.位置參數(shù)移動當位置變量個數(shù)超出9個時,就不能直接引用位置大于9的位置變量了,必須用shift命令移動位置參數(shù)。(1)一般形式:shift[n](2)說明:每次執(zhí)行時,把位置參數(shù)向左移動n位。如果沒有參數(shù),每次執(zhí)行時,把位置參數(shù)向左移動1位。44*1.4位置參數(shù)下述是一個shell程序的ex9_4_1.sh,只帶了一個參數(shù)(名字),并在屏幕上顯示這個名字:#Namedisplayprogramif[$#-eq0]thenecho“Namenotprovided”elseecho”Yournameis$1”fi45*1.4位置參數(shù)在bash中,如果執(zhí)行ex9_4_1.sh如下:#.ex9_4_1.sh將得到輸出:Namenotprovided但是,如果執(zhí)行ex9_4_1.sh如下:#.ex9_4_1.shzhang則得到如下的輸出:Yournameiszhangex9_4_1.sh還說明了shell編程的另一個方面,即內(nèi)部變量。在ex9_4_1.sh中的變量$#是內(nèi)部變量,并提供傳給shell程序的位置參數(shù)的數(shù)目。46*1.4位置參數(shù)位置變量小結位置變量表示$0,$1……$9在腳本中使用位置參數(shù)向系統(tǒng)命令傳遞參數(shù)$0$1$2$3$4$5$6$7$8$9腳本名字ABCDEF47*1.4位置參數(shù)48*1.5特殊字符特殊字符中的某些字符字符說明
$指出shell變量名的開始
|把標準輸出通過管道傳送到下個命令
#標記注釋開始
&在后臺執(zhí)行進程
?匹配一個字符*匹配一個或幾個字符
>輸出重定向操作符
<輸入重定向操作符49*1.5特殊字符特殊字符中的某些字符(續(xù))
字符說明
>>輸出重定向操作符{添加到文件}<<跟在輸入結束字符串后(HERE)操作符
[]列出字符的范圍
[a-z]意a到z的全部字符
[a,z]意指a或z字符
.filmname執(zhí)行(“源”)文件空格在兩個字之間的間隔符50*1.5特殊字符注釋符‘#’在shell編程中經(jīng)常要對某些正文行進行注釋,以增加程序的可讀性。在Shell中以字符“#”開頭的正文行表示注釋行。51*1.5特殊字符雙引號在字符串含有嵌入的空格時,用雙引號括起來。這是一個有關bash的例子:var=”teststring”newvar=”Valueofvaris$var”echo$newvar執(zhí)行上面的三行shell程序,可得到如下的結果:Valueofvaristeststring52*1.5特殊字符單引號利用單引號把字符括起來,以阻止shell解析變量。把前面的雙引號改為單引號var=”teststring”newvar=‘Valueofvaris$var’echo$newvar執(zhí)行程序可得到如下的結果:Valueofvaris$var53*1.5特殊字符反斜杠在某個字符前利用反斜杠可以阻止shell把后面的字符解釋為特殊字符。例如,把$test的值賦給變量var。輸入如下命令:var=$test如下命令才把$test存放在var中:var=\$test54*1.5特殊字符55*1.5特殊字符反引號通知shell執(zhí)行由反引號定義的字符串。當需要把執(zhí)行命令的結果存放在變量中時,就可以在shell程序中利用反引號。例1:統(tǒng)計當前目錄下一個文件中test.txt有幾行并把結果存在叫做var的變量中:var=`wc-ltest.txt`例2:string=”currentdirectoryis`pwd`”echo$stringcurrentdirectouris/home/xyz56*1.5特殊字符示例代碼運行結果57*1.5特殊字符管道可以通過管道把一個命令的輸出傳遞給另一個命令作為輸入。管道用豎杠|表示。格式:命令1|命令2舉例:catmyls-l|grep"myfile"58*1.5特殊字符文件重定向改變程序運行的輸入來源和輸出地點。重定向標準輸出catfile|sort>sort.outpwd>>path.out>newfile重定向標準輸入sort<filesort<name.txt>name.out59*1.5特殊字符60*1.5特殊字符61*1.6運算符運算符是對計算機發(fā)的指令運算對象數(shù)字、字符變量表達式表達式:運算符和運算對象的組合體62*1.6運算符$[]表示形式告訴shell對方括號中的表達式求值$[2+8]63*1.6運算符賦值運算符=、+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>=64*1.6運算符表達式替換$[]和$(())兩種格式功能一樣,所有的shell的求值都是用整數(shù)完成$[]可以接受不同基數(shù)的數(shù)字[base#n]n表示基數(shù)從2到36的任何基數(shù)65*1.7輸入和輸出echoecho命令可以顯示文本行或變量,或者把字符串輸入到文件。echo[option]string-e解析轉義字符-n回車不換行,linux系統(tǒng)默認回車換行轉義符(\c,\f,\t,\n,\a)c不換行,f進紙,t跳格,n換行,a響鈴。。。66*1.7輸入和輸出67*1.7輸入和輸出readread語句可以從鍵盤或文件的某一行文本中讀入信息,并將其賦給一個變量。readvarible1varible2…如果只指定了一個變量,那么read將會把所有的輸入賦給該變量,直到遇到第一個文件結束符或回車;如果給出了多個變量,它們按順序分別被賦予不同的變量。Shell將用空格作為變量之間的分隔符。68*1.7輸入和輸出69*1.8表達式的比較shell程序中的test命令在bash/pdksh中,命令test用于計算一個條件表達式的值。他們經(jīng)常在條件語句和循環(huán)語句中被用來判斷某些條件是否滿足。test命令的語法格式:testexpression
或者
[expression]70*1.8表達式的比較1.數(shù)字比較-eq比較兩個數(shù)是否相等-ne比較兩個數(shù)是否不等-gt比較一個數(shù)是否大于另一個數(shù)-ge比較一個數(shù)是否大于或是等于另一個數(shù)-lt比較一個數(shù)是否小于另一個數(shù)-le比較一個數(shù)是否小于或是等于另一個數(shù)71*1.8表達式的比較例72*1.8表達式的比較2.字符串比較=比較兩個字符串是否相等,同則為“是”!=比較兩個字符串是否不相等,不同則為“是”-z判斷字符長度是否等于零,等于則為“是”
-n判斷字符長度是否大于零,大于零則為“是”73*1.8表達式的比較示例代碼74*1.8表達式的比較運行結果75*1.8表達式的比較3.文件操作符-e如果文件存在則為真-r確定是否對文件設置了讀許可-w確定文件是否設置了寫許可-x確定文件是否設置了執(zhí)行許可-s確定文件是否具有大于零的長度-d確定文件是否為目錄-f確定文件是否為普通文件-L
確定文件是否為符號連接文件76*1.8表達式的比較例77*1.8表達式的比較4.邏輯操作符邏輯操作符用來根據(jù)邏輯規(guī)則比較表達式。!,-a,-o字符表示NOT、AND和OR!求反(”非”)邏輯表達式-a邏輯AND(”與”)兩個邏輯表達式-o邏輯OR(”或”)兩個邏輯表達式78*1.8表達式的比較例79*1.9流程控制語句一、條件語句二、循環(huán)語句三、雜項語句80*1.9流程控制語句——一、條件語句一、條件語句1.if語句2.case語句81*1.9流程控制語句——一、條件語句1.if語句if語句通過判斷邏輯表達式來作出選擇,在bash中的條件語句有如下的格式:if[expression];thenstatementselif[expression];thenstatementselsestatementsfiif條件是可以嵌套的。82*1.9流程控制語句——一、條件語句2.case語句case語句是用來執(zhí)行依賴于離散值或是匹配指定變量值的范圍的語句。bash的case語句如下:casestrinstr1|str2)statements;;str3|str4)statements;;*)statements;;esac每個條件下用雙分號(;;)來終止語句!83*1.9流程控制語句——一、條件語句84*1.9流程控制語句——二、循環(huán)語句循環(huán)語句:用于重復執(zhí)行一系列命令。一)for語句二)until語句三)while語句四)select語句85*一)for語句1.第一種格式如下:for變量名in列表do命令1命令2?done當變量值在列表里,for循環(huán)即執(zhí)行一次所有命令,使用變量名訪問列表中取值。命令可為任何有效的shell命令和語句。變量名為任何單詞。In列表用法是可選的,如果不用它,for循環(huán)使用命令行的位置參數(shù)。in列表可以包含替換、字符串和文件名.例如:86*一)for語句87*例:假設需要把目錄中的每個文件在一個叫做backup的子目錄中建立備份在bash中執(zhí)行如下的程序:一)for語句88*一)for語句89*2.第二種格式如下:
forcurvardostatementsdone
在這種格式中,對傳給shell程序的每個位置參數(shù)執(zhí)行一次statements。對每次循環(huán),把位置參數(shù)的當前值賦給變量curvar。記住$@提供傳給shell程序的一系列參數(shù),全部參數(shù)排在一起。這種格式也可以寫成如下:forcurvarin“$@”do
statesmentsdone一)for語句90*一)for語句91*3.第三種格式:for((i=0;i<10;i++))doecho$idone一)for語句92*二)until語句用來執(zhí)行一系列命令直到所指定的條件為真才能終止。在bash中,利用如下的格式:untilexpressiondostatementsdone93*1.9流程控制語句——二、循環(huán)語句3.while語句在bash中,利用的如下的格式:whileexpressiondostatementsdone94*1.9流程控制語句——二、循環(huán)語句例:求前五個偶數(shù)的和bash的shell程序如下:95*1.9流程控制語句——二、循環(huán)語句96*1.9流程控制語句——二、循環(huán)語句4.select語句select語句的格式如下:selectiteminitemlistdostatementsdoneitemlist是可選的,當未給出itemlist時,系統(tǒng)通過item中的項目一次重復一個,但當給出itemlist時,系統(tǒng)對itemlist中的每個項重復,對每次重復把itemlist的當前值賦給item,而后item可作為執(zhí)行語句的一部分。97*1.9流程控制語句——二、循環(huán)語句如果編寫一個提供用戶挑選Continue或Finsh的選擇菜單,則可編寫如下的shell程序:
#!/bin/bashselectiteminContinueFinshdoif[$item=“Finsh”];thenbreakfidone
執(zhí)行select命令時,系統(tǒng)向用戶顯示一個選擇數(shù)字的菜單——在這種情況下:1表示Continue,2表示Finsh。當用戶選擇1時,變量item包含值Continue;而當用戶選擇2時,變量item包含值Finsh.。當用戶選擇2時,即執(zhí)行if語句,并終止循環(huán)。98*1.9流程控制語句——三、雜項語句雜項語句:1.shift語句2.break語句3.exit語句99*1.9流程控制語句——三、雜項語句1.shift語句用來處理位置參數(shù),并從左到右每次處理一個參數(shù)。應該記得,位置參數(shù)是用$1、$2、$3等來標識的。shift命令的作用時,把每個位置參數(shù)向左移動一個位置,而當前的$1丟失。shift命令的格式如下:shiftnumber參數(shù)number是移動的數(shù)目,是可選的。當不特別指定number時,缺省值為1,即參數(shù)向左移動一個位置。當指定number時,則向左移動number個位置。100*1.9流程控制語句——三、雜項語句101*1.9流程控制語句——三、雜項語句2.break語句用來終止重復執(zhí)行的循環(huán)。break通常在進行一些處理后退出循環(huán)或case語句。如果是在一個嵌入循環(huán)里,可以指定跳出的循環(huán)個數(shù)。例如如果在兩層循環(huán)內(nèi),用break2剛好跳出整個循環(huán)。3.continue語句它不會跳出循環(huán),只是跳過這個循環(huán)步。102*1.10函數(shù)函數(shù)是shell程序中執(zhí)行特殊過程的部件,并在shell程序中可以重復調(diào)用。下面是在bash中函數(shù)定義格式。func(){statements}可以調(diào)用函數(shù)如下:funcparam1param2param3參數(shù)param1param2等是可以選擇的。還能把參數(shù)作為單字符串來傳送,例如$@。函數(shù)可以分析參數(shù),就好像它們是傳送給shell程序的位置參數(shù)。103*1.10函數(shù)104*4.10函數(shù)105*1.10函數(shù)106*1.10函數(shù)107*1.10函數(shù)例:在傳送月份數(shù)字后顯示月份名或出錯信息。displaymonth(){case$1in*)echo”Invalidparameter”esac}displaymonth8
程序顯示如下:
MonthisAugust01|1)echo“MonthisJanuary”;;02|2)echo“MonthisFebruary”;;03|3)echo“MonthisMarch”;;04|4)echo“MonthisApril”;;05|5)echo“MonthisMay”;;06|6)echo“MonthisJune”;;07|7)echo“MonthisJuly”;;08|8)echo“MonthisAugust”;;09|9)echo“MonthisSeptember”;;10)echo“MonthisOctober”;;11)echo“MonthisNovember”;;12)echo“MonthisDecember”;;108*
Linux編程及應用
主講:任繼平郵箱:109*參考教材:linux軟件工程師(C語言)實用教程110*課程要求:111*課程內(nèi)容:112*第1章Linux系統(tǒng)程序設計基礎113*第1章Linux系統(tǒng)程序設計基礎114*本章重點編輯、編譯及運行Linuxc程序gcc編譯器的使用gdb調(diào)試器的使用115*1.1第一個Linuxc程序
例1-1:設計一個程序,要求在屏幕上輸出“這是第一個Linuxc程序!”。步驟1:設計編輯源程序代碼使用文本編輯器vim,在終端中輸出:[root@localhostroot]#vim1-1.c
輸入完成后存盤:按ESC鍵→輸入“:wq”回車
116*1.1第一個Linuxc程序步驟2:編譯程序查看當前目錄下是否有1-1.c文件,輸入命令:
[root@localhostroot]#ls1-1.c編譯:[root@localhostroot]#gcc1-1.c-o1-1[root@localhostroot]#步驟3:運行程序[root@localhostroot]#ls1-1.c1-1[root@localhostroot]#./1-1這是第一個Linuxc程序!117*1.1第一個Linuxc程序Linux下的文本編輯器軟件主要有vim、gedit和Emacs,Linux下的c編譯器中,gcc是功能最強大、使用最廣泛的軟件。gcc編譯的常用格式為:gccC源文件-o目標文件名或:gcc-o目標文件名C源文件或:gcc目標文件名最后一種情況目標文件名默認為:c.out118*1.1第一個Linuxc程序printf函數(shù)說明思考題:設計一個程序,要求在屏幕上輸出:************119*1.2gcc編譯器gcc是(GNUCmpilerCollection的簡稱),它是GNU項目中符合ANSIC標準的編譯系統(tǒng),能夠編譯用C、C++和ObjectC等語言編寫的程序。gcc不僅功能十分強大,結構也異常靈活。它可以通過不同的前端模塊來支持各種語言,如Java、Fortran、Pascal、Modula-3和Ada等。gcc是可以在多種硬體平臺上編譯出可執(zhí)行程序的超級編譯器,其執(zhí)行效率與一般的編譯器相比,平均效率要高20%~30%。gcc支持編譯的后綴名:120*121*1.2.1使用gccgcc指令的一般格式為:gcc[參數(shù)]要編譯的文件[參數(shù)][目標文件]例1-2:設計一個程序,要求把輸入的百分制的成績轉換成五級制輸出。即輸入成績大于等于90分,顯示“優(yōu)秀”;若成績介于80~90分,顯示“良好”;若成績介于70~80分,顯示“中等”;若成績介于60~70分,顯示“及格”;若成績小于60分,顯示“不及格”。 122*1.2.1使用gcc步驟1:編輯源程序代碼
[root@localhostroot]#vim1-2.c123*1.2.1使用gcc步驟2:用gcc編譯程序[root@localhostroot]#gcc1-2.c–o1-2步驟3:運行程序[root@localhostroot]#./1-2思考題:設計一個程序,要求輸入一個數(shù),如果此數(shù)大于0,顯示“輸入的為正數(shù)”,否則顯示“輸入的為負數(shù)”。124*1.2.2gcc編譯流程125*1.2.2gcc編譯流程例1-3:設計一個程序,要求輸入兩個整數(shù),求和輸出。通過使用gcc的參數(shù),控制gcc的編譯過程,了解gcc的編譯過程,進一步認識gcc的靈活性。步驟1:編輯源程序代碼[root@localhostroot]#vim1-3.c126*127*1.2.2gcc編譯流程步驟2:預處理階段[root@localhostroot]#gcc1-3.c–o1-3.i–E[root@localhostroot]#vim1-3.i步驟3:編譯階段[root@localhostroot]#gcc1-3.i–o1-3.s–S[root@localhostroot]#vim1-3.s步驟4:匯編階段[root@localhostroot]#gcc1-3.s–o1-3.o–c128*1.2.2gcc編譯流程步驟5:鏈接階段Linux系統(tǒng)把printf和scanf函數(shù)的實現(xiàn),都放在了libc.so.6的庫文件中。在沒有參數(shù)指定時,gcc到系統(tǒng)默認的路徑“/usr/lib”下查找,鏈接到libc.so.6庫函數(shù)中去,這樣就有了printf和scanf函數(shù)的實現(xiàn)部分。把程序中一些函數(shù)的實現(xiàn),這是鏈接階段的工作。完成鏈接后,gcc就可以生成可執(zhí)行程序文件
注意:gcc在編譯的時候默認使用動態(tài)鏈接庫,編譯鏈接時并不把庫文件的代碼加入到可執(zhí)行文件中,而是在程序執(zhí)行的時候動態(tài)加載鏈接庫,這樣可以節(jié)省系統(tǒng)開銷。129*1.2.2gcc編譯流程scanf函數(shù)說明130*1.2.3gcc編譯器的主要參數(shù)1.總體參數(shù)當頭文件與gcc不在同一目錄下要用-Idir編譯,它是指頭文件,而添加庫文件時需用-Ldir參數(shù)。131*1.2.3gcc編譯器的主要參數(shù)例1-4:設計一個程序,要求把輸入的字符串原樣輸出,程序中的頭文件自己定義,源程序文件為“1-4.c”,自定義的頭文件為“my.h”,放在目錄“/root”下。步驟1:設計編輯源程序代碼1-4.c[root@localhostroot]#vim1-4.c132*1.2.3gcc編譯器的主要參數(shù)步驟2:設計編輯自定義的頭文件my.h[root@localhostroot]#vimmy.h步驟3:正常編譯1-4.c文件:[root@localhostroot]#gcc1-4.c–o1-4編譯器提示出錯。133*注意:在include語句中,“<>”表示在默認路徑“/usr/include”中搜索頭文件,引號“”
””表示在本目錄中搜索。因此,前面例子中把1-3.c中的“#include<my.h>”改成“#include“my.h””,就不需要“-Idir”參數(shù)也能正確編譯了。步驟4:加“-Idir”參數(shù)編譯:[root@localhostroot]#gcc1-4.c–o1-4–I/root134*1.2.3gcc編譯器的主要參數(shù)getchar函數(shù)說明135*1.2.3gcc編譯器的主要參數(shù)putchar函數(shù)說明思考題:此例能不能用前面的printf函數(shù)和scanf函數(shù)?如果可以,要如何改寫程序?136*1.2.3gcc編譯器的主要參數(shù)例1-5:有程序1-5.c用到目錄“/root/lib”下的一個動態(tài)庫libsunq.so。[root@localhostroot]#gcc1-5.c–o1-5.c–L/root/lib–lsunqLinux下的庫文件命名時有一個規(guī)定:必須以l、i、b三個字母開頭,因此,在用“-l”指定鏈接庫文件時可以省去l、i、b三個字母。也就是說“-llibsunq”有時候寫成“-lsunq”。 137*1.2.3gcc編譯器的主要參數(shù)例1-6:設計一個程序,要求把輸入的數(shù)字作為X軸坐標,算出它的sin值。步驟1:編輯源程序代碼[root@localhostroot]#vim1-6.c138*1.2.3gcc編譯器的主要參數(shù)步驟2:用gcc編譯程序[root@localhostroot]#gcc1-6.c–o1-6結果發(fā)現(xiàn)編譯器報錯:原因是需要指定函數(shù)的具體路徑,要查找函數(shù)sin,輸入:[root@localhostroot]#nm-o/lib/*.so|grepsin139*1.2.3gcc編譯器的主要參數(shù)在/lib/libm-2.3.2.so:00008610Wsin中除去函數(shù)庫頭lib及函數(shù)的版本號-2.3.2,所余下的符號為“m”,在編譯時用字符“l(fā)”與余下的符號“m”相連接成“l(fā)m”,在編譯時加上此參數(shù)就能正確地通過編譯,即:[root@localhostroot]#gcc1-6.c–o1-6-lm步驟3:運行程序[root@localhostroot]#./1-6注意:Linux下動態(tài)鏈接庫默認后綴名“.so”,靜態(tài)鏈接庫默認后綴名“.a”。140*1.2.3gcc編譯器的主要參數(shù)gcc的常用告警和出錯參數(shù)141*1.2.3gcc編譯器的主要參數(shù)例1-7:設計一個程序,要求打印“這是一段用于測試的垃圾程序!”,里面包含一些非標準語法。步驟1:設計編輯源程序代碼
[root@localhostroot]#vim1-7.c
142*步驟2:關閉所有告警[root@localhostroot]#gcc1-7.c–o1-7–w步驟3:顯示不符合ANSIc標準語法的告警信息[root@localhostroot]#gcc1-7.c–o1-7–ansi步驟4:
允許發(fā)出ANSIc標準所列的全部警告信息[root@localhostroot]#gcc1-7.c–o1-7–pedantic步驟5:允許發(fā)出gcc提供的所有有用的告警信息[root@localhostroot]#gcc1-7.c–o1-7–Wall143*1.2.3gcc編譯器的主要參數(shù)優(yōu)化參數(shù)代碼優(yōu)化指的是編譯器通過分析源代碼,找出其中尚未達到最優(yōu)的部分,然后對其重新進行組合,目的是改善程序的執(zhí)行性能。gcc提供的代碼優(yōu)化功能非常強大,它通過編譯參數(shù)“-On”來控制優(yōu)化代碼的生成,其中n是一個代表優(yōu)化級別的整數(shù)。通常來說,數(shù)字越大優(yōu)化的等級越高,同時也就意味著程序的運行速度越快。144*1.2.3gcc編譯器的主要參數(shù)例1-8:設計一個程序,要求循環(huán)8億次左右,每次都有一些可以優(yōu)化的加減乘除運算。比較gcc的編譯參數(shù)“-On”優(yōu)化程序前后的運行速度。步驟1:編輯源程序代碼:145*步驟2:不加任何優(yōu)化參數(shù)進行編譯。[root@localhostroot]#gcc1-8.c–o1-8步驟3:用time命令大致統(tǒng)計出該程序在運行時所需要的時間。[root@localhostroot]#time./1-8步驟4:加“-O2”優(yōu)化參數(shù)進行編譯。[root@localhostroot]#gcc1-8.c–o1-8–O2步驟5:再統(tǒng)計優(yōu)化后的程序運行時所需要的時間。[root@localhostroot]#time./1-8步驟6:對比兩次執(zhí)行的輸出結果。146*1.2.3gcc編譯器的主要參數(shù)優(yōu)化雖然能夠給程序帶來更好的執(zhí)行性能,但在一些場合中應該避免優(yōu)化代碼。程序開發(fā)的時候。資源受限的時候。跟蹤調(diào)試的時候。147*1.3gdb調(diào)試器1.gdb概述Linux下的gdb調(diào)試器,是一款GNU組織開發(fā)并發(fā)布的UNIX/Linux下的程序調(diào)試工具。它沒有圖形化的友好界面,但功能強大。在進行應用程序的調(diào)試之前,要注意的是gdb進行調(diào)試的是可執(zhí)行文件,而不是如“.c”這樣的源代碼文件。因此,需要先通過gcc編譯生成可執(zhí)行文件才能用gdb進行調(diào)試。148*1.3gdb調(diào)試器2.使用gdb調(diào)試程序例1-9:設計一個程序,要求輸入兩個整數(shù),判斷并輸出其中的最小數(shù)。步驟1:編輯源程序代碼:
149*150*1.3gdb調(diào)試器步驟2:
用gcc編譯程序[root@localhostroot]#gcc1-9.c–o1-9–g步驟3:
進入gdb調(diào)試環(huán)境[root@localhostroot]#gdb1-9注意:gdb是命令行調(diào)試環(huán)境,調(diào)試程序都在提示符“(gdb)”后輸入相應的命令,gdb的命令很多,可以在提示符“(gdb)”后輸入help進行查找。常用的gdb命令151*1.3gdb調(diào)試器步驟4:
用gdb調(diào)試程序(1)查看源文件在gdb中輸入“l(fā)”(list)就可以查看程序源代碼,一次顯示10行;注意:gdb命令“l(fā)”(list)列出源代碼的時候,要確保原來的源程序還在,如果讀者以為這象反匯編一樣給出代碼,那就錯了,其實只是列出源文件的內(nèi)容。
特別提示:“l(fā)ist”+行號:查看指定位置的代碼,如“l(fā)ist1”就是從第一行開始列出源代碼。(2)設置斷點在gdb中設置斷點命令是“b”(break),后面跟行號或者函數(shù)名。如:(gdb)b10152*1.3gdb調(diào)試器(3)查看斷點信息用命令“infob”(infobreak)查看斷點信息。注意:gdb在一個程序中可以設置多個斷點,有多個斷點中斷時,“Num”處顯示斷點序號。(4)運行程序:輸入“r”(run)開始運行程序。注意:gdb默認從第一行開始運行,如果要從程序中指定行開始運行,只需輸入“r”+行號。(5)查看變量值程序運行到斷點處會自動暫停,輸入“p變量名”153*1.3gdb調(diào)試器調(diào)試程序時,可能需要修改變量值,程序運行到斷點處時,輸入“set變量=設定值”,例如給變量“a2”賦值11,輸入“seta2=11”。gdb在顯示變量值時都會在對應值前加“$n”標記,它是當前變量值的引用標記,以后想再引用此變量,可以直接使用“$n”,提高了調(diào)試效率。注意:查看變量值,不能在程序結束后。154*(6)單步運行在斷點處輸入“n”(next)或者“s”(step)。它們之間的區(qū)別在于:若有函數(shù)調(diào)用時,“s”會進入該函數(shù)而“n”不會進入該函數(shù)。(7)繼續(xù)運行程序輸入“c”(continue)命令恢復程序的正常運行,把剩余的程序執(zhí)行完,并顯示執(zhí)行結果。(8)退出gdb環(huán)境:輸入“q”(quit)命令。思考題:此例中,如果比較的結果剛好相反,應該把斷點設置在第幾行?調(diào)試的時候還需要注意什么才能看出變量的值?155*思考與實驗編寫一個簡單的c語言程序:輸出兩行文字“Linux下的c也不是太難嘛!”,在Linux下編輯、編譯、運行。編寫一個簡單的c語言程序:根據(jù)輸入的兩個整數(shù)求平均值并且在終端輸出,通過gcc編譯器得到它的匯編程序文件。用gdb調(diào)試器調(diào)試上面第2題的程序,查看程序執(zhí)行每一步變量的值,熟悉gdb的使用流程。編寫一個c語言程序:打印輸出所有“水仙花數(shù)”,用gdb調(diào)試程序(給出步驟,至少十步以上)。所謂“水仙花數(shù)”是指一個3位數(shù),其各位數(shù)字立方和等于該數(shù)本身。例如,153是一水仙花數(shù),因為153=13+53+33。156*第2章文件分割和多文件編譯157*本章重點函數(shù)編寫與函數(shù)參數(shù)的傳遞多文件系統(tǒng)多文件系統(tǒng)中使用make使用autotools158*2.1函數(shù)函數(shù)指功能相對獨立,由一系列語句組成的模塊,它的目的有:當設計一個大型程序時,如果能夠將這個程序依照功能,將其分割成較小的功能,然后依據(jù)這些小功能的要求編寫函數(shù),可以使程序簡單化,同時也會使最后檢查錯誤變得容易。在一個程序中,會產(chǎn)生指令重復使用多次的問題,將這些重復使用的指令編寫成一個函數(shù),需要時加以調(diào)用,可以提高編程效率,也可以使程序精簡。159*2.1.1函數(shù)簡介C語言函數(shù)可分為庫函數(shù)和用戶定義函數(shù):庫函數(shù):由C系統(tǒng)提供,用戶無須定義,也不必在程序中作類型說明,只需在程序前包含有該函數(shù)原型的頭文件即可在程序中直接調(diào)用。用戶自定義函數(shù):由用戶按需要編寫的函數(shù)。對于用戶自定義函數(shù),不僅要在程序中定義函數(shù)本身,在很多情況下還必須對該函數(shù)進行原型說明,然后才能使用。160*2.1.1函數(shù)簡介例2-1:設計一個程序,要求在屏幕上打印輸出五行“Linux程序設計,有點意思!”的字符串。步驟1:編輯源程序代碼;步驟2:用gcc編譯程序[root@localhostroot]#gcc2-1.c–o2-1步驟3:運行程序[root@localhostroot]#./2-1161*2.1.1函數(shù)簡介162*2.1.1函數(shù)簡介在c語言中,所有的函數(shù)定義都是平行的。即在一個函數(shù)的函數(shù)體內(nèi),不能再定義另一個函數(shù),。但是函數(shù)之間允許相互調(diào)用,也允許嵌套調(diào)用。習慣上把調(diào)用者稱為主調(diào)函數(shù)。函數(shù)還可以自己調(diào)用自己,稱為遞歸調(diào)用。函數(shù)的一般形式:函數(shù)類型函數(shù)名(形參類型:形式參數(shù)1,形參類型:形式參數(shù)2,……){類型說明;語句;}163*2.1.2返回值函數(shù)調(diào)用時,主調(diào)函數(shù)把實參的值傳送給被調(diào)函數(shù)的形參,從而實現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送。函數(shù)調(diào)用中數(shù)據(jù)傳送是單向的。即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。因此在函數(shù)調(diào)用過程中,形參的值發(fā)生改變,并不會影響到實參。函數(shù)運行結束,如果被調(diào)函數(shù)的結果需要傳遞回主調(diào)函數(shù),通常用用return完成這項任務,叫函數(shù)的返回值。164*2.1.2返回值例2.2:設計一個程序,要求編寫函數(shù)max,有兩個參數(shù),返回兩個數(shù)中的最大值給主函數(shù)。步驟1:編輯源程序代碼步驟2:用gcc編譯程序
[root@localhostroot]#gcc2-2.c–o2-2步驟3:運行程序[root@localhostroot]#./2-2思考題:如果把此例中的數(shù)據(jù)傳遞改成指針傳送,程序應該如何設計?165*166*2.2文件分割例2.3:設計一個程序,要求計算輸入的整數(shù)的平均值,并將此程序分割成多個小文件。步驟1:編輯源程序代碼167*168*2.2文件分割步驟2:分析程序、分割文件 將此程序分割成下列2個Linuxc程序。 (1)2-3-main.c為主程序:
(2)2-3-avg.c為avg函數(shù)的定義:步驟3:用gcc編譯程序[root@localhostroot]#gcc2-3-main.c2-3-avg.c–o2-3步驟4:運行程序[root@localhostroot]#./2-3169*170*2.2文件分割Linuxc文件分割,主要是把每個自定義函數(shù)分割成獨立的c源程序文件,自定義函數(shù)的聲明部分需要包含在主調(diào)函數(shù)中,這兒的主調(diào)函數(shù)是main。如果自定義函數(shù)較多,也可以把函數(shù)聲明都分割成獨立的頭文件,在主調(diào)函數(shù)中用#include包含分割出來的頭文件。思考題:如何把自定義函數(shù)的聲明部分,也分割成獨立的文件,分割后如何編譯?171*2.2文件分割例2.4:分割例2-2中的程序,要求分割后自定義函數(shù)在另一個獨立的文件中。步驟1:分析程序、分割文件例2-2程序有主函數(shù)main和自定義函數(shù)max,再把函數(shù)聲明都分割成獨立的頭文件,可將此程序分割成下列3個文件。(1)2-4-main.c為主程序:(2)2-4-max.c為max函數(shù)的定義
:(3)max.h為頭文件,內(nèi)含max函數(shù)的聲明:172*2.2文件分割173*2.2文件分割步驟2:用gcc編譯程序
[root@localhostroot]#gcc2-4-main.c2-4-max.c–o2-4步驟3:運行程序[root@localhostroot]#./2-4思考題:能否將此例中的#include"max.h"修改成#include<max.h>,為什么?174*2.3make工程管理器make工程管理器是一個“自動編譯管理器”,這里的“自動”是指它能夠根據(jù)文件時間戳自動發(fā)現(xiàn)更新過的文件而減少編譯的工作量,同時,它通過讀入makefile文件的內(nèi)容來執(zhí)行大量的編譯工作。用戶只需編寫一次簡單的編譯語句就可以了。它大大的提高了實際的工作效率。175*2.3.1編寫makefile文件在一個Makefile文件中通常包含如下內(nèi)容:需要由make工具創(chuàng)建的目標體(target),通常是目標文件或可執(zhí)行文件。要創(chuàng)建的目標所依賴的文件。創(chuàng)建每個目標體時需要運行的命令。176*2.3.1編寫makefile文件例2.5:設計一個程序,要求計算學生的總成績和平均成績,并用make工程管理器編譯。步驟1:分析程序、分割文件此程序有主函數(shù)main和自定義函數(shù)fun_sum和fun_avg,再把函數(shù)聲明都分割成獨立的頭文件,可將此程序分割成下列4個文件。(1)2-5-main.c為主程序: (2)chengji.h為頭文件,內(nèi)含fun_avg和fun_sum函數(shù)的聲明:177*2.3.1編寫makefile文件(3)2-5-fun_sum.c為fun_sum函數(shù)的定義:(4)2-5-fun_avg.c為fun_avg函數(shù)的定義:178*2.3.1編寫makefile文件179*2.3.1編寫makefile文件步驟2:編輯makefile文件[root@localhostroot]#vimmake
makefile內(nèi)容:步驟3:用make命令編譯程序[root@localhostroot]#make–fmake步驟4:
用make命令再次編譯修改4個文件中的一個,重新用make編譯,會發(fā)現(xiàn)只編譯了2-5-main.c程序,另外的2個c源程序文件根本沒有重新編譯。步驟5:運行程序[root@localhostroot]#./2-5180*從結果來看,在沒有使用gcc編譯器命令情況下,依然把設計的程序編譯成了可執(zhí)行文件,實現(xiàn)了設計的功能,可見make工程管理器調(diào)用了gcc編譯器,makefile文件的編寫是重點。181*2.3.2makefile變量的使用例2.6:設計一個程序,程序運行時從三道題目中隨機抽取一道,題目存放在二維數(shù)組中。步驟1:分析程序、分割文件此程序有主函數(shù)main和自定義函數(shù)fun_shuiji,可以分割成兩個“.c”程序文件;再把函數(shù)聲明和用到的庫函數(shù)的頭文件,分割到一個獨立的自定義頭文件“shuiji.h”;因此,可將此程序分割成3個文件。(1)2-6-main.c為主程序(2)shuiji.h為頭文件(3)2-6-fun_sum.c文件182*183*184*2.3.2makefile變量的使用步驟2:編輯makefile文件[root@localhostroot]#vimmake一般的makefile寫法:使用變量的makefile寫法如下:
步驟3:用make命令編譯程序[root@localhostroot]#make–fmake
步驟4:運行程序[root@localhostroot]#./2-6185*186*2.3.2makefile變量的使用Makefile中常見預定義變量187*2.3.2makefile變量的使用Makefile中常見自動變量思考題:如果此例的題目數(shù)、題目內(nèi)容以及隨機抽取的題目量,都由用戶決定,應該如何修改程序?makefile文件要不要修改?188*2.3.3make和makefilemakefile文件主要包含了5部分內(nèi)容:顯式規(guī)則。說明了如何生成一個或多個目標文件。由makefile文件的創(chuàng)作者指出,包括要生成的文件、文件的依賴文件、生成的命令。隱式規(guī)則。由于make有自動推導的功能,所以隱式的規(guī)則可以比較粗糙地簡略書寫makefile文件,這是由make所支持的。189*3.變量定義。在makefile文件中要定義一系列的變量,變量一般都是字符串,這與C語言中的宏有些類似。當makefile文件執(zhí)行時,其中的變量都會擴展到相應的引用位置上。190*2.3.3make和makefile文件指示。其包括3個部分,一個是在一個makefile文件中引用另一個makefile文件;另一個是指根據(jù)某些情況指定makefile文件中的有效部分;還有就是定義一個多行的命令。注釋。makefile文件中只有行注釋,其注釋用“#”字符。如果要在makefile文件中使用“#”字符,可以用反斜框進行轉義,如:“\#”。191*2.3.3make和makefileGNU的make工作時的執(zhí)行步驟:讀入所有的makefile文件。讀入被include包括的其他makefile文件。初始化文件中的變量。推導隱式規(guī)則,并分析所有規(guī)則。為所有的目標文件創(chuàng)建依賴關系鏈。根據(jù)依賴關系,決定哪些目標要重新生成。執(zhí)行生成命令。
192*2.4autotools的使用autotools工具只需用戶輸入簡單的目標文件、依賴文件、文件目錄等就可以輕松地生成makefile了??梢酝瓿上到y(tǒng)配置信息的收集,從而可以方便地處理各種移植性的問題。autotools是系列工具,包含有:aclocalautoscanautoconfautoheaderautomake193*2.4autotools的使用用autotools產(chǎn)生Makefile文件的總體流程194*2.4autotools的使用利用autotools系列工具生成“Makefile”文件的基本步驟:195*2.4autotools的使用例2.7:利用例2.3中的兩個程序文件“2-3-main.c”和“2-3-avg.c”,把它們的文件名分別改成“2.7.main.c”和“2.7.avg.c”,用autotools工具生成makefile文件。步驟1:
使用autoscan。196*2.4autotools的使用步驟2:
修改“configure.scan”文件,重命名成“configure.in”文件修改時需要增加一個宏AM_INIT_AUTOMAKE(PACKAGE,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑結構設計委托施工合同
- 超市倉儲后勤人員招聘協(xié)議
- 保育工作經(jīng)驗分享交流心得體會范文(14篇)
- 預防手足口病傳染病
- 關于軍訓感言800字(15篇)
- 2024年房屋租賃合同涉及的裝修改造約定
- 2024年房產(chǎn)估價合作協(xié)議
- 廢品失效分析實習心得13篇
- 《信用證流程》課件
- 有關國旗下的演講稿5篇
- 趙學慧-老年社會工作理論與實務-教案
- 《世界主要海峽》
- 住院醫(yī)師規(guī)范化培訓師資培訓
- “三新”背景下的數(shù)學課堂教學 論文
- 中央企業(yè)商業(yè)秘密安全保護技術指引2015版
- 螺旋果蔬榨汁機的設計
- 《脊柱整脊方法》
- 會計與財務管理專業(yè)英語智慧樹知到答案章節(jié)測試2023年哈爾濱商業(yè)大學
- 廣東省2020年中考英語試題【含答案】
- 0417 教學能力大賽 公共基礎《英語 》教學實施報告 電子商務專業(yè)
- 攔砂壩施工設計方案
評論
0/150
提交評論