版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第6章 Unix系統(tǒng)編程基礎理解:程序設計環(huán)境(用戶空間和系統(tǒng)空間)理解:基于操作系統(tǒng)的程序設計(系統(tǒng)調用)掌握: C/C+編輯器 GCC掌握: GNU make和makefile的編寫規(guī)則掌握 :C/C+調試器 GDB了解:常用系統(tǒng)調用及庫函數(shù)的使用方法了解:常用函數(shù)庫glib的使用了解:程序管理軟件SCCSCVS第1頁,共49頁。6.1 程序設計環(huán)境理想的程序設計環(huán)境單任務環(huán)境-單用戶、單進程多任務環(huán)境下的程序設計用戶程序不能直接控制系統(tǒng)的硬件設備用戶程序通過操作系統(tǒng)來控制系統(tǒng)的資源存儲中存在:用戶程序空間和系統(tǒng)空間程序程序程序系統(tǒng)核心空間(內核)第2頁,共49頁。6.2 基于操作系統(tǒng)支持
2、的程序設計建立系統(tǒng)編程的思想站在資源管理者的角度來分析問題,充分考慮系統(tǒng)為用戶程序提供哪些服務和資源,以實現(xiàn)對系統(tǒng)資源的有效利用嵌入式系統(tǒng)系統(tǒng)調用用戶程序通過系統(tǒng)調用實現(xiàn)對系統(tǒng)內核功能的使用及對各種硬件資源的訪問了解:系統(tǒng)調用的使用方法輸入、輸出控制類進程、線程管理類:創(chuàng)建、終止、同步、互斥等內存及輔存管理類第3頁,共49頁。6.2 基于操作系統(tǒng)支持的程序設計設備控制類本地進程通信管理類網(wǎng)絡進程通信管理類系統(tǒng)調用與庫函數(shù)的關系系統(tǒng)調用是操作系統(tǒng)層面提供的服務,庫函數(shù)是高級語言提供的服務用戶程序庫函數(shù)用戶程序系統(tǒng)調用第4頁,共49頁。6.3 在UNIX中完成C程序開發(fā)編程語言低級語言機器語言:
3、能夠由機器直接執(zhí)行。匯編語言: 包含一些助記符,需要由匯編程序將其翻譯成機器語言。高級語言:需要由編譯程序和解釋語言將其翻譯成機器語言COBOL、BASIC、C/C+、PASCAL、FORTRAN、JAVA第5頁,共49頁。6.3 在UNIX中完成C程序開發(fā)建立可執(zhí)行程序的步驟建立源文件建立目標文件建立可執(zhí)行文件源代碼目標代碼:由編譯程序和解釋程序把源代碼翻譯成機器能夠理解的語言。目標代碼不是可執(zhí)行文件,它還缺少庫文件。可執(zhí)行代碼可能包含其它程序代碼,由鏈接程序將目標代碼和其它程序代碼鏈接在一起,形成完整的可執(zhí)行程序庫文件指的是為用戶程序和操作系統(tǒng)之間提供接口的程序第6頁,共49頁。6.3 在
4、UNIX中完成C程序開發(fā)區(qū)別編譯程序和解釋程序編譯程序:把高級語言翻譯成機器語言。它一次編譯所有的程序代碼,在編譯完成之前沒有任何結果反饋;解釋程序:把高級語言翻譯成機器語言。它一次翻譯一行代碼,并立即將執(zhí)行結果反饋。 編譯程序產生更好且效率更高的目標代碼; 解釋程序在每次執(zhí)行時都會重新解釋源代碼,效率較低Linux中的C/C+編譯程序是GCCLinux中的SHELL解釋程序是BASH第7頁,共49頁。6.3.1 GCC:C/C+ 編譯器GCC(GNU C Compiler)是GNU推出的功能強大、性能優(yōu)越的多平臺編譯器,gcc編譯器能將C、C+語言源程序、匯編語言和目標程序編譯、鏈接成可執(zhí)行
5、文件,以下是gcc支持編譯的一些源文件的后綴及其解釋(點擊)使用gcc將C源代碼文件生成可執(zhí)行文件,需要經(jīng)歷4個相關的步驟:預處理,編譯,匯編,鏈接預處理鏈接編譯組譯源程序(*.c)可執(zhí)行文件預處理器編譯器組譯器鏈接器第8頁,共49頁。gcc支持編譯的源文件后綴第9頁,共49頁。GCC的使用方法gcc的基本用法:gcc 選項 文件名列表gcc的選項說明:-c只編譯并生成目標文件(.o)-g生成調試信息-o file指定生成的文件名這里的文件名列表指的是需要編譯和鏈接的文件,例如C, C+源文件,目標文件,匯編程序代碼等。gcc的選項非常多,可以使用man gcc來查看,我們經(jīng)常使用的選項是 -
6、c -g -o第10頁,共49頁。gcc命令的常用選項第11頁,共49頁。幾個簡單的C程序實例hello.cgcc -o hello hello.c./hello計算階乘的程序將多個源程序編譯成一個可執(zhí)行文件gcc -o factorial factorial_main.c factorial.c./ factorial n編譯一個C+程序GCC編譯器可通過后綴名判斷c(.c)或c+程序(.C/.cpp),使用g+進行編譯g+ -o hello_C hello.cpp第12頁,共49頁。改正錯誤及重定向標準錯誤如果源程序有誤,希望將錯誤信息重定向到某個文件,以便于逐一糾錯,可使用如下語句gcc
7、 hello_error.c -o hello_error 2error重定向標準錯誤1 file: 標準輸出設備的重定向2 file: 標準錯誤輸出的重定向rootstu1 no10# cat errorhello_error.c: In function main:hello_error.c:9: syntax error before printf第13頁,共49頁。6.3.2 GNU make和makefile文件GNU make makefile 基本結構 makefile 變量 GNU make 的主要預定義變量 隱含規(guī)則 makefile 范例 運行 make第14頁,共49頁。
8、GNU make利用 make 工具來自動完成編譯工作。這些工作包括:如果僅修改了某幾個源文件,則只重新編譯這幾個源文件;如果某個頭文件被修改了,則重新編譯所有包含該頭文件的源文件。利用這種自動編譯可大大簡化開發(fā)工作,避免不必要的重新編譯。make 工具通過一個稱為 makefile 的文件來完成并自動維護編譯工作。makefile 需要按照某種語法進行編寫,其中說明了如何編譯各個源文件并鏈接生成可執(zhí)行文件,并定義了源文件之間的依賴關系。 當修改了其中某個源文件時,如果其他源文件依賴于該文件,則也要重新編譯所有依賴該文件的源文件。第15頁,共49頁。GNU make默認情況下,GNU make
9、 工具在當前工作目錄中按如下順序搜索 makefileGNU makefilemakefileMakefile在 UNIX 系統(tǒng)中,習慣使用 Makefile作為 makefile文件。如果要使用其他文件作為 makefile,則可利用類似下面的 make 命令選項指定 makefile 文件: make -f Makefile.debug第16頁,共49頁。makefile的基本結構makefile 中一般包含如下內容:需要由 make工具創(chuàng)建的項目,通常是目標文件和可執(zhí)行文件。通常使用“目標(target)”一詞來表示要創(chuàng)建的項目。要創(chuàng)建的項目依賴于哪些文件;創(chuàng)建每個項目時需要運行的命令;
10、例子:假設你現(xiàn)在有一個 C+ 源文件 test.C,該源文件包含有自定義的頭文件 test.h,則目標文件 test.o 明確依賴于兩個源文件:test.C 和 test.h。另外你可能只希望利用 g+ 命令來生成 test.o 目標文件。 這時就可以利用如下的 makefile 來定義 test.o 的創(chuàng)建規(guī)則 第17頁,共49頁。Makefile基本結構實例1演示:例1當 test.C 或 test.h 文件在編譯之后又被修改,則 make 工具可自動重新編譯 test.o,如果在前后兩次編譯之間,test.C 和 test.h 均沒有被修改,而且 test.o 還存在的話,就沒有必要重新
11、編譯。test.o: test.C test.h g+ -c -g test.C指定 test.o 為目標依賴文件指定了如何從目標所依賴的文件建立目標第18頁,共49頁。Makefile基本結構一個 makefile 文件中可定義多個目標,利用 make target 命令可指定要編譯的目標,如果不指定目標, 則使用第一個目標。通常,makefile 中定義有 clean 目標,可用來清除編譯過程中的中間文件,例如: clean: rm -f *.o 運行 make clean 時,將執(zhí)行 rm -f *.o 命令,最終刪除所有編譯過程中產生的所有中間文件。第19頁,共49頁。makefile
12、 實例2 Network: Subrs.o network.o gcc -o Network Subrs.o network.oSubrs.o: Subrs.c Netdefs.h gcc -c Setwork.o: network.c Netdefs.h gcc -c network.cclean: rm -f *.o演示:例2第20頁,共49頁。Makefile變量GNU 的 make 工具除提供有建立目標的基本功能之外,還有許多便于表達依賴性關系以及建立目標的命令的特色。其中之一就是變量或宏的定義能力。如果你要以相同的編譯選項同時編譯十幾個 C 源文件,而為每個目 標的編譯指定冗長的編譯
13、選項的話,將是非常乏味的。但利用簡單的變量定義,可避免這種乏味的工作# Define macros for name of compiler CC = gcc # Define a macro for the CC flags CFLAGS = -c -g # A rule for building a object file test.o: test.c test.h $(CC) $(CFLAGS) test.c 第21頁,共49頁。GNU make 的主要預定義變量GNU make 有許多預定義的變量,這些變量具有特殊的含義,可在規(guī)則中使用。表 1-5 給出了一些主要的 預定義變量,除這些
14、變量外,GNU make 還將所有的環(huán)境變量作為自己的預定義變量。 第22頁,共49頁。GNU make 的主要預定義變量第23頁,共49頁。隱含規(guī)則 (1)GNU make包含有一些內置的或隱含的規(guī)則,這些規(guī)則定義了如何從不同的依賴文件建立特定類型的目標。 GNU make 支持兩種類型的隱含規(guī)則:后綴規(guī)則(Suffix Rule):后綴規(guī)則是定義隱含規(guī)則的老風格方法。后綴規(guī)則定義了將一個具有某個后綴的文件(例如,.c 文件)轉換為具有另外一種后綴的文件(例如,.o 文件)的方法。每個后綴規(guī)則以兩個成對出現(xiàn)的后綴名定義,例如,將 .c 文件轉換為 .o 文件的后綴規(guī)則可定義為: .c .o:
15、 $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $ $ 第24頁,共49頁。隱含規(guī)則 (2)模式規(guī)則(pattern rules):這種規(guī)則更加通用,因為可以利用模式規(guī)則定義更加復雜的依賴性規(guī)則。 模式規(guī)則看起來非常類似于正則規(guī)則,但在目標名稱的前面多了一個 % 號,同時可用來定義目標和依賴 文件之間的關系,例如下面的模式規(guī)則定義了如何將任意一個 x.c 文件轉換為 x.o 文件: %.c:%.o $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $ $ 第25頁,共49頁。make 運行GNU make 命令還有一些其他選項第26頁,共49頁。make
16、file 范例根據(jù)圖示依賴關系編寫一個makefile文件,依賴關系圖如下:演示:例3第27頁,共49頁。make的實例ns.exe: link.o node.o ns.ogcc -o ns.exe link.o node.o ns.olink.o: link.c link.h.config.hgcc -c ode.o: node.c node.h config.hgcc -c s.o: ns.c ns.h config.hgcc -c ns.cclean:rm -f *.o第28頁,共49頁。使用automake和autoconf產生makefile在開始使用automake和autocon
17、f之前,請先確認系統(tǒng)已經(jīng)安裝以下的軟件:GNU automakeGNU autoconfGNU m4PerlGNU Libtool (如果你需要產生shared library)automake 所產生的 makefile 除了可以做到程序的編譯和鏈接,也已經(jīng)把如何產生程序文件的操作,以及把安裝程序都考慮進去了,所以源程序所存放的目錄架構最好符合GNU的標準慣例,下面用hello.c來作為例子進行說明。第29頁,共49頁。使用automake和autoconf產生makefile在工作目錄下建立一個新的子目錄4,再在4下建立一個hello的子目錄,這個目錄將作為存放 hello 這個程序及其相
18、關文件的地方:#include int main(int argc, char* argv) printf(Hello, GNU!n); return 0;演示:例4第30頁,共49頁。使用automake和autoconf產生makefile具體步驟執(zhí)行autoscan命令生成configure.scan 編輯修改configure.scan文件,并且把文件名改成configure.in autoscan的作用在于掃描源代碼以搜尋普通的可移植性問題,比如檢查編譯器,庫,頭文件等configure.in里的內容是一些宏定義,目的是為了檢測程序運行所需要的一些參數(shù)或環(huán)境變量等第31頁,共49頁。
19、使用automake和autoconf產生makefile修改configure.in文件,最主要的是手動添加AM_INIT_AUTOMAKE宏,并修改AC_OUTPUT指定Makefile文件的生成位置第32頁,共49頁。使用automake和autoconf產生makefile執(zhí)行aclocal命令生成aclocal.m4文件執(zhí)行autoheader命令,通過configuer.in中的某些宏運行上一步生成的m4文件,生成config.h.inaclocal.m4是一個perl腳本程序執(zhí)行autoconf生成configure腳本 新建并編輯Makefile.am文件configure是一
20、套配置軟件源代碼的腳本。autoconf命令依據(jù)configure.in文件來生成configure腳本,途中利用了aclocal.m4文件Makefile.am文件中定義的宏和目標,會指導automake生成指定的代碼第33頁,共49頁。使用automake和autoconf產生makefile執(zhí)行automake -add-missing命令生成Makefile.in文件新建Makefile.am文件,指定生成的可執(zhí)行文件和源文件之后通過autoconf生成的configure腳本,配合automake生成的Makefile.in文件,就可以產生一份符合GNU Makefile慣例的Mak
21、efile第34頁,共49頁。使用automake和autoconf產生makefile最后執(zhí)行 ./configure :現(xiàn)在你的目錄下已經(jīng)產生了一個Makefile文件,執(zhí)行make命令就可以開始編譯hello.c 成執(zhí)行文件,最后執(zhí)行./hello:# makegcc -DPACKAGE=hello -DVERSION=1.0 -I. -I. -g -O2 -c hello.cgcc -g -O2 -o hello hello.o# ./helloHello! GNU!第35頁,共49頁。6.3.3 GDB :Linux調試工具Linux系統(tǒng)中包含了GNU 調試程序gdb,它是一個用來調
22、試C和 C+ 程序的調試器??梢允钩绦蜷_發(fā)者在程序運行時觀察程序的內部結構和內存的使用情況。gdb所提供的一些功能如下所示:運行程序,設置所有的能影響程序運行的參數(shù)和環(huán)境;控制程序在指定的條件下停止運行;當程序停止時,可以檢查程序的狀態(tài);修改程序的錯誤,并重新運行程序; 動態(tài)監(jiān)視程序中變量的值; 可以單步執(zhí)行代碼,觀察程序的運行狀態(tài)。 第36頁,共49頁。GDB調試說明gdb程序調試的對象是可執(zhí)行文件,而不是程序的源代碼文件。如果要讓產生的可執(zhí)行文件可以用來調試,需在執(zhí)行gcc指令編譯程序時,加上-g參數(shù),指定程序在編譯時包含調試信息。調試信息包含程序里的每個變量的類型和在可執(zhí)行文件里的地址映
23、射以及源代碼的行號。gdb 利用這些信息使源代碼和機器碼相關聯(lián)??稍?makefile 中如下定義 CFLAGS 變量: CFLAGS = -g rootstu1 no10# gcc -g hello_error.c -o hello_error rootstu1 no10# gdb第37頁,共49頁。GDB的幫助在 gdb 提示符處鍵入help,將列出命令的分類,鍵入 help 后跟命令的分類名,可獲得該類命令的詳細清單。 如果想要了解某個具體命令(比如break)的幫助信息,在gdb提 示符下輸入下面的命令:help breakbreak的作用是設置斷點aliases:命令別名breakp
24、oints:斷點定義data:數(shù)據(jù)查看iles:指定并查看文件internals:維護命令running:程序執(zhí)行stack:調用棧查看statu:狀態(tài)查看tracepoints:跟蹤程序執(zhí)行。另一個獲得gdb幫助的方法是瀏覽gdb的手冊頁。# man gdb第38頁,共49頁。GDB的常用命令gdb的基本命令gdb filename其中filename是要調試的可執(zhí)行文件。用這種方式運行gdb可以直接指定想要調試的程序。這和啟動gdb后執(zhí)行file filename命令效果完全一樣。gdb支持很多的命令且能實現(xiàn)不同的功能。這些命令從簡單的文件裝入到允許你檢查所調用的堆棧內容的復雜命令,下面列
25、出了在使用gdb 調試時會用到的一些命令。file命令:裝入想要調試的可執(zhí)行文件cd命令:改變工作目錄第39頁,共49頁。gdb 常用命令pwd命令:打印當前工作日錄。 run命令:執(zhí)行當前被調試的程序。 list命令:列出正在調試的應用程序的源代碼。 break命令:設置斷點。 kill命令:停止正在調試的應用程序。tbreak命令;設置臨時斷點。它的語法與break相同。區(qū)別在于用tbreak設置的斷點執(zhí)行一次之后立即消失。watch命令:設置監(jiān)視點,監(jiān)視表達式的變化。continue命令: 繼續(xù)正在執(zhí)行調試的程序。該命令用在程序由于處理信號或斷點而導致停止運行的情況。第40頁,共49頁。
26、gdb 常用命令awatch命令:設置讀寫監(jiān)視點。當要監(jiān)視的表達式被讀或寫時將應用程序掛起。它的語法與watch命令相同。rwatch命令:設置讀監(jiān)視點,當監(jiān)視表達式被讀時將程序掛起,等侍調試。此命令的語法與watch相同。next命令:執(zhí)行下一條源代碼,但是不進入函數(shù)內部。也就是說,將一條函數(shù)調用作為一條語句執(zhí)行。執(zhí)行這個命令的前提是已經(jīng)run,開始了代碼的執(zhí)行。 第41頁,共49頁。gdb 常用命令step命令:執(zhí)行下一條源代碼,進入函數(shù)內部。如果調用了某個函數(shù),會跳到函數(shù)所在的代碼中等候一步步執(zhí)行。執(zhí)行這個命令的前提是已經(jīng)用run開始執(zhí)行代碼。display命令:在應用程序每次停止運行時
27、顯示表達式的值。info break命令:顯示當前斷點列表,包括每個斷點到達的次數(shù)info files命令:顯示調試文件的信息。 info func命令:顯示所有的函數(shù)名。 第42頁,共49頁。gdb 常用命令info local命令:顯示當前函數(shù)的所有局部變量的信息。 info prog命令:顯示調試程序的執(zhí)行狀態(tài)。print命令;顯示表達式的值。 delete命令:刪除斷點。指定一個斷點號碼,則刪除指定斷點。不指定參數(shù)則刪除所有的斷點。 Shell命令:執(zhí)行Linux Shell命令。 make命令:不退出gdb而重新編譯生成可執(zhí)行文件。 quit命令:退出gdb。第43頁,共49頁。GDB的簡單實例#include static char buff256;static char *string;int main() printf(please input a string:n); gets(string); prin
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度木材行業(yè)碳排放權交易合同8篇
- 二零二五版農村電商合作發(fā)展合同4篇
- 二零二五年度環(huán)保設施滅四害服務合同及環(huán)保標準協(xié)議4篇
- Preparing for Pregnancy助產專業(yè)資源庫
- 水電安裝工程2025年度工程監(jiān)理合同2篇
- 2025版民間借貸教育基金擔保合同示例3篇
- 2025年度生態(tài)環(huán)保項目投資擔保合同書
- 2025年度離婚財產分割糾紛訴訟保全與執(zhí)行全程服務合同2篇
- 二零二五年度水利工程內部施工合同4篇
- 2025年度個人別墅抵押借款合同范本5篇
- 乳腺癌的綜合治療及進展
- 【大學課件】基于BGP協(xié)議的IP黑名單分發(fā)系統(tǒng)
- 2025年八省聯(lián)考高考語文試題真題解讀及答案詳解課件
- 信息安全意識培訓課件
- 2024年山東省泰安市初中學業(yè)水平生物試題含答案
- 美的MBS精益管理體系
- 中國高血壓防治指南(2024年修訂版)解讀課件
- 2024安全員知識考試題(全優(yōu))
- 2024年衛(wèi)生資格(中初級)-中醫(yī)外科學主治醫(yī)師考試近5年真題集錦(頻考類試題)帶答案
- 中國大百科全書(第二版全32冊)08
- 第六單元 中華民族的抗日戰(zhàn)爭 教學設計 2024-2025學年統(tǒng)編版八年級歷史上冊
評論
0/150
提交評論