版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第3章Linux編程環(huán)境3.1編輯器vi3.2編譯器gcc3.3調(diào)試器GDB3.4make工具和Makefile規(guī)則3.5
glibc本章小結(jié)
3.1編輯器vi
3.1.1vi簡介
vi編輯器最初是由SunMicrosystems公司的BillJoy在1976年開發(fā)的,一開始BillJoy開發(fā)了Ex編輯器(行編輯器),后來開發(fā)了vi作為Ex的visualinterface,也就是允許一次能看到一屏的文本而非一行,vi因此而得名。圖3-1vi界面3.1.2vi用法
vi有三種模式:命令行模式;最后行模式;文本輸入
模式。
1.命令行模式下使用vi
在命令行模式下都是要輸入命令,但命令不是以“?:?”開始,這與最后行模式下的命令格式有所區(qū)別,它直接接受鍵盤輸入的單字符或組合字符命令,例如直接按下u就表示取消上一次對文件的修改,相當(dāng)于Windows下的Undo操作。
2.最后行模式下使用vi
在最后行模式下,所有命令都要以“?:?”開始,所鍵入的字符系統(tǒng)均作命令來處理。例如,:q代表退出,:w表示存盤。最后行模式下常用命令及其含義如表3-2所示。
3.文本輸入模式下使用vi
在文本輸入模式下,不能打入指令,必需先按Esc鍵,返回命令方式。假若用戶不知身處何種模式下,也可以按Esc鍵,則不管處于何種模式下,都會返回命令行模式。
文本輸入模式下常用命令及其含義如表3-3所示。3.1.3vi使用實例分析
1.?vi使用實例內(nèi)容
(1)在?/root目錄下建一個名為?/vi的目錄;
(2)進入?/vi目錄;
(3)將文件?/etc/inittab復(fù)制到?/vi目錄下;
(4)使用vi打開?/vi目錄下的inittab;
(5)將光標(biāo)移到該行;
(6)復(fù)制該行內(nèi)容;
(7)將光標(biāo)移到最后一行行首;
(8)粘貼復(fù)制行的內(nèi)容;
(9)撤銷第(8)步的動作;
(10)將光標(biāo)移動到最后一行的行尾;
(11)粘貼復(fù)制行的內(nèi)容;
(12)光標(biāo)移到“si::sysinit:/etc/rc.d/rc.sysinit”;
(13)刪除該行;
(14)存盤但不退出;
(15)將光標(biāo)移到首行;
(16)插入模式下輸入“Hello,thisisviworld!”;
(17)返回命令行模式;
(18)向下查找字符串“0:wait”;
(19)再向上查找字符串“halt”;
(20)強制退出vi,不存盤。
2.?vi使用實例解析
在該實例中,每一步的使用命令如下所示。
(1)
mkdir/root/vi
(2)
cd/root/vi
(3)
cp/etc/inittab./
(4)
vi./inittab
(5)
17<enter>(命令行模式)
(6)?yy
(7)?G
(8)?p
(9)?u
(10)?$
(11)?p
(12)?21G
(13)?dd
(14)?:w(最后行模式)
(15)?1G
(16)?i并輸入“Hello,thisisviworld!”(文本輸入模式)
(17)?Esc
(18)?/0:wait(命令行模式)
(19)??halt
(20)?:q!(最后行模式)
3.2編譯器gcc
3.2.1gcc簡介
Linux系統(tǒng)下的gcc(GNUCCompiler)是GNU推出的功能強大、性能優(yōu)越的多平臺編譯器,是GNU的代表作品之一。gcc是可以在多種硬件平臺上編譯出可執(zhí)行程序的超級編譯器,其執(zhí)行效率與一般的編譯器相比平均要高20%~30%。gcc編譯器能將C、C++?語言源程序、匯編語言源程序和目標(biāo)程序編譯、連接成可執(zhí)行文件,如果沒有給出可執(zhí)行文件的名字,gcc將生成一個名為a.out的文件。3.2.2gcc的執(zhí)行過程
雖然稱gcc是C語言的編譯器,但使用gcc由C語言源代碼文件生成可執(zhí)行文件的過程不僅僅是編譯的過程,而是要經(jīng)歷四個相互關(guān)聯(lián)的步驟:預(yù)處理(也稱預(yù)編譯,Preprocessing)、編譯(Compilation)、匯編(Assembly)和鏈接(Linking),如圖3-2所示。圖3-2gcc編譯過程
1.預(yù)處理階段
在預(yù)處理階段,若輸入的是C語言的源文件,通常為?*.c。它們通常帶有.h之類頭文件的包含文件。這個階段主要處理源文件中的?#ifdef、#include和?#define命令。
2.編譯階段
編譯器在預(yù)處理結(jié)束之后,gcc首先要檢查代碼的規(guī)范性、是否有語法錯誤等,以確定代碼實際要做的工作,在檢查無誤后,就開始把代碼翻譯成匯編語言,gcc的選項“-S”能使編譯器在進行完匯編之前就停止。
3.匯編階段
在匯編階段,將輸入的匯編文件?*.s轉(zhuǎn)換成機器語言?*.o,這個階段對應(yīng)的gcc命令如下例所示:
gcc-c-ohello.ohello.s
4.鏈接階段
在成功編譯之后,就進入了鏈接階段。在上面這個程序中并沒有定義“printf”的函數(shù)實現(xiàn),在預(yù)編譯中包含進的“stdio.h”中也只有該函數(shù)的聲明,而沒有定義函數(shù)的實現(xiàn)。3.2.3gcc的基本用法和選項
在使用gcc編譯器的時候,必須給出一系列必要的調(diào)用參數(shù)和文件名稱。gcc編譯器的調(diào)用參數(shù)大約有100個,其中多數(shù)參數(shù)很少使用,這里只介紹最基本、最常用的參數(shù)。
gcc最基本的用法是:
gcc
[options]
[filenames]3.2.4gcc編譯實例
下面是一個非常簡單的HelloWorld實例。使用在第一節(jié)中學(xué)習(xí)vi的用法,編輯一個文件名hello.c的源文件,文件的內(nèi)容如下:
#include“stdio.h”
intmain(intargc,char*argv[])
{
char*pszStr=“Helloworld\n”;
printf(“Hello,world\n”);
exit(0);
}
3.3調(diào)試器GDB
3.3.1
GDB簡介
所有的程序在寫好以后,都要經(jīng)過調(diào)試,在調(diào)試過程中發(fā)現(xiàn)并改正程序中的錯誤。如果沒有GDB,程序員為了跟蹤某些錯誤,就要在程序中加入大量的語句,用來產(chǎn)生一些特定的輸出。對于某些程序來說,這樣做會導(dǎo)致更多的錯誤。3.3.2GDB常用命令
GDB的命令很多,本節(jié)介紹一些最常用的命令。
在介紹之前,先介紹GDB中的一個非常有用的功能:補齊功能。
1.啟動GDB
假設(shè)文件名為hello,用GDB調(diào)試它,可以輸入gdbhello來啟動GDB并載入程序。在命令行上鍵入gdbhello并按回車鍵就可以運行GDB了。
2.載入程序file
在GDB內(nèi),載入程序很簡單,使用file命令,如filehello。當(dāng)然,程序的路徑名要正確。
3.退出GDBquit
在GDB的命令方式下,輸入quit,就可以退出GDB。
4.運行程序run
當(dāng)GDB中已將要調(diào)試的程序載入后,可以用run命令來執(zhí)行。如果程序需要參數(shù),可以在run指令后接著輸入?yún)?shù),就像在Shell下執(zhí)行一個需要參數(shù)的命令一樣。
5.查看程序信息info
info指令用來查看程序的信息,當(dāng)用helpinfo查看幫助時,info指令的參數(shù)足足占了兩個屏幕,它的參數(shù)非常多,但大部分不常用。
6.列出一段源程序list
列出某個函數(shù):
listFUNCTION
以當(dāng)前源文件的某行為中間顯示一段源程序:
listLINENUM
接著前一次繼續(xù)顯示:
list顯示前一次之前的源程序:
list
顯示另一個文件的一段程序:
listFILENAME:FUNCTION
或listFILENAME:LINENUM
7.設(shè)置斷點break
有許多種設(shè)置斷點的方法。如下:
(1)在函數(shù)入口設(shè)置斷點
breakFUNCTION
(2)在當(dāng)前源文件的某一行上設(shè)置斷點
breakLINENUM
(3)在另一個源文件的某一行上設(shè)置斷點
breakFILENAME:LINENUM
(4)在某個地址上設(shè)置斷點,當(dāng)調(diào)試的程序沒有源程序時很有用
break*ADDRESS
8.條件斷點
break...ifCOND
COND是一個布爾條件表達(dá)式,語法與C語言中的一樣。條件斷點與一般的斷點不同之處是每當(dāng)程序執(zhí)行到斷點處,都要計算條件表達(dá)式,如果為真,程序才會中斷,否則程序會一直執(zhí)行下去。
9.設(shè)置監(jiān)視點watch
當(dāng)調(diào)試一個很大的程序,并且在跟蹤一個關(guān)鍵的變量時,發(fā)現(xiàn)這個變量不知在哪兒被改動過,如何才能找到改動它的地方?這時可以使用watch命令。簡單地說,監(jiān)視點可以監(jiān)視某個表達(dá)式或變量,當(dāng)它被讀或被寫時讓程序中斷。watch命令的用法如下:
watchEXPRESSION
10.檢查數(shù)據(jù)
最常用的檢查數(shù)據(jù)的方法是使用print命令。
printexp
11.修改變量值
在調(diào)試程序時,可能想改變一個變量的值。用set指令可以修改變量的值:
setvarible=value
例如,想將一個變量tmp的值賦為10:
settmp=10
12.檢查內(nèi)存值
檢查內(nèi)存值的指令是x,x是examine的意思。用法如下:
x/NFUADDR
13.輸出格式
缺省情況下,輸出格式依賴于它的數(shù)據(jù)類型。但可以改變輸出格式。當(dāng)使用print命令時,可以用一個參數(shù)/F來選擇輸出的打印格式。F可以是以下的一些值:
‘x’十六進制整數(shù)格式;
‘d’有符號十進制整數(shù)格式;
‘u’無符號十進制整數(shù)格式;
'f'浮點數(shù)格式。
14.單步執(zhí)行指令
單步執(zhí)行指令有兩個:step和next。step可以跟蹤進入一個函數(shù),而next指令則不會進入函數(shù)。
15.繼續(xù)執(zhí)行指令
當(dāng)程序被斷下,查看所需的信息后,輸入continue,程序會繼續(xù)執(zhí)行下去。
16.幫助指令help
在GDB中,如果想知道一條指令的用法,最方便的方法是使用help。使用方法很簡單:在help后跟上指令名。例如,想知道list指令用法,輸入:
helplist3.3.3GDB使用實例
下面通過一個簡單的實例來講述GDB的使用方法,這里所介紹的指令都是GDB中最基本也是最常用的指令。
3.4make工具和Makefile規(guī)則
3.4.1
make和Makefile概述
什么是Makefile?
或許很多Windows的程序員都不知道這個東西,因為那些Windows的集成開發(fā)環(huán)境都做了這個工作,但要做一個專業(yè)的程序員,必須了解Makefile。會不會寫Makefile,從一個側(cè)面說明了一個程序員是否具備完成大型軟件工程的能力。什么是make?
make是一個命令工具,用于解釋Makefile中的指令。3.4.2
Makefile文件內(nèi)容
Makefile主要包含了以下五個部分:
(1)顯式規(guī)則。
(2)隱晦規(guī)則。
(3)變量的定義。
(4)文件指示。
(5)注釋。3.4.3
Makefile規(guī)則
以下用一個示例來說明Makefile的書寫規(guī)則。一個工程中有a.c、b.c兩個文件。根據(jù)a.c,b.c兩個文件之間的依賴關(guān)系,寫出如下的makefile(在vi中編寫):
#makefile
hello:a.cb.c
gcc-ohelloa.cb.c3.4.4make工作原理
Linux下GNU的Make工作流程如下:
①查找當(dāng)前目錄下的Makefile文件;
②初始化Makefile文件中的變量;
③分析Makefile中的所有規(guī)則;
④為所有的目標(biāo)文件創(chuàng)建依賴關(guān)系;
⑤根據(jù)依賴關(guān)系決定哪些目標(biāo)文件要重新生成;
⑥執(zhí)行生成命令。3.4.5Makefile中的變量
在Makefile中可以定義自己的變量。
例如上例中的第一個Makefile可以改寫如下:
#Makefile
CC=gcc
hello:a.cb.c #定義變量
$(CC)-ohelloa.cb.c #引用變量3.4.6
clean命令的應(yīng)用
每個Makefile中都應(yīng)該寫一個清空目標(biāo)文件(.o和執(zhí)行文件)的規(guī)則,?這不僅便于重編譯,也利于保持文件的清潔。一般清空目標(biāo)文件的規(guī)則是:
clean:
rm
edit
$(objects)3.4.7
Makefile文件示例
1.實例要求
(1)用vi在同一目錄下編輯兩個簡單的hello程序,如下
所示:
(2)仍在同一目錄下用vi編輯Makefile,且不使用變量替換,用一個目標(biāo)體實現(xiàn)(即直接將hello.c和hello.h編譯成hello目標(biāo)體)。然后用make驗證所編寫的Makefile是否正確。
(3)將上述Makefile使用變量替換實現(xiàn)。同樣用make驗證所編寫的Makefile是否正確。
(4)編輯另一Makefile,取名為Makefile1,不使用變量替換,但用兩個目標(biāo)體實現(xiàn)(也就是首先將hello.c和hello.h編譯為hello.o,再將hello.o編譯為hello),再用make的“-f”選項驗證這個Makefile1的正確性。
(5)將上述Makefile1使用變量替換實現(xiàn)。
2.實驗步驟
(1)用vi打開上述兩個代碼文件“hello.c”和“hello.h”。
(2)在Shell命令行中用gcc嘗試編譯,使用命令:“gcchello.c-ohello”,并運行hello可執(zhí)行文件查看結(jié)果。
(3)刪除此次編譯的可執(zhí)行文件:rmhello。
(4)用vi編輯Makefile,如下所示:
hello:hello.chello.h
gcchello.c-ohello
(5)退出保存,在Shell中鍵入make,查看結(jié)果。
(6)再次用vi打開Makefile,用變量進行替換,如下所示:
OBJS:=hello.o
CC:=Gcc
hello:$(OBJS)
$(CC)$^-o$@
(7)退出保存,在Shell中鍵入make,查看結(jié)果。
(8)用vi編輯Makefile1,如下所示:
hello:hello.o
gcchello.o-ohello
hello.o:hello.chello.h
gcc-chello.c-ohello.o
(9)退出保存,在Shell中鍵入Make-fMakefile1,查看結(jié)果。
(10)再次用vi編輯Makefile1,如下所示:
OBJS1:=hello.o
OBJS2:=hello.chello.h
CC:=Gcc
hello:$(OBJS1)
$(CC)$^-o$@
$(OBJS1):$(OBJS2)
$(CC)-c$<-o$@
在這里請注意區(qū)別“$^”和“$<”。
(11)退出保存,在Shell中鍵入make-fMakefile1,查看
結(jié)果。
3.5
glibc
3.5.1
Linux編程庫簡介
所謂Linux編程庫就是指始終可以被多個Linux軟件項目重復(fù)使用的代碼集。以C語言為例,它包含了幾百個可以重復(fù)使用的例程和調(diào)試程序的工具代碼,其中包括函數(shù)。如果每次編寫新程序都要重新寫這些代碼會非常不方便,使用編程庫有兩個主要優(yōu)點:
(1)可以簡化編程,實現(xiàn)代碼重復(fù)使用,進而減小應(yīng)用程序的大小。
(2)可以直接使用比較穩(wěn)定的代碼。圖3-3Linux編程庫3.5.2
Linux線程庫
進程和線程的概念及區(qū)別和聯(lián)系如下:
進程:資源管理的最小單位。
線程:程序執(zhí)行的最小單位。
一個進程至少需要一個線程作為它的指令執(zhí)行體;進程管理著資源,如文件、內(nèi)存、CPU等,一個進程可以擁有多個線程。多線程程序的優(yōu)點:
(1)提高應(yīng)用程序響應(yīng)。
(2)使多CPU系統(tǒng)更加有效。
(3)改善程序結(jié)構(gòu)。下面通過一個實例講述多線程的原理。
/*example.c*/
#include“pthread.h”
#include“stdio.h”
#include“unistd.h”
voidthread(void)
{
inti;
for(i=0;i<3;i++)
printf(“Thisisapthread\n”);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年四川貨運從業(yè)資格考試模擬考試題目答案
- 2025加工承攬合同書
- 洛陽文化旅游職業(yè)學(xué)院《電氣系統(tǒng)仿真》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025汽車及運輸合同書
- 建筑加固灰工施工合同
- 2024年書畫藝術(shù)品交易合同3篇
- 環(huán)保公司水電節(jié)能措施
- 2024事業(yè)單位臨時工聘任合同模板:后勤保障服務(wù)2篇
- 知識產(chǎn)權(quán)投資與融資
- 2025捐贈合同 標(biāo)準(zhǔn)版模板全
- 中國當(dāng)前的民族問題
- 陜西省建筑防火設(shè)計、審查、驗收疑難問題技術(shù)指南-ppt
- 海警法智慧樹知到答案章節(jié)測試2023年大連海洋大學(xué)
- 手機號碼段歸屬地數(shù)據(jù)庫(2016年3月)
- 《借貸記賬法》教學(xué)設(shè)計
- 【試題】人教版二年級下數(shù)學(xué)暑假每日一練
- 衛(wèi)生院關(guān)于開展?jié)M意度調(diào)查工作的實施方案
- 紡織材料學(xué)選擇題
- YY/T 0916.1-2021醫(yī)用液體和氣體用小孔徑連接件第1部分:通用要求
- 醫(yī)務(wù)科工作思路(計劃)6篇
- GB/T 13912-2020金屬覆蓋層鋼鐵制件熱浸鍍鋅層技術(shù)要求及試驗方法
評論
0/150
提交評論