![第六章UNIX系統(tǒng)編程基礎_第1頁](http://file4.renrendoc.com/view/0c461dccc67ece5aa963cb0bb95fa40a/0c461dccc67ece5aa963cb0bb95fa40a1.gif)
![第六章UNIX系統(tǒng)編程基礎_第2頁](http://file4.renrendoc.com/view/0c461dccc67ece5aa963cb0bb95fa40a/0c461dccc67ece5aa963cb0bb95fa40a2.gif)
![第六章UNIX系統(tǒng)編程基礎_第3頁](http://file4.renrendoc.com/view/0c461dccc67ece5aa963cb0bb95fa40a/0c461dccc67ece5aa963cb0bb95fa40a3.gif)
![第六章UNIX系統(tǒng)編程基礎_第4頁](http://file4.renrendoc.com/view/0c461dccc67ece5aa963cb0bb95fa40a/0c461dccc67ece5aa963cb0bb95fa40a4.gif)
![第六章UNIX系統(tǒng)編程基礎_第5頁](http://file4.renrendoc.com/view/0c461dccc67ece5aa963cb0bb95fa40a/0c461dccc67ece5aa963cb0bb95fa40a5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第6章Unix系統(tǒng)編程基礎理解:程序設計環(huán)境(用戶空間和系統(tǒng)空間)理解:基于操作系統(tǒng)的程序設計(系統(tǒng)調用)掌握:C/C++編輯器GCC掌握:GNUmake和makefile的編寫規(guī)則了解
:C/C++調試器GDB了解:常用系統(tǒng)調用及庫函數(shù)的使用方法了解:常用函數(shù)庫glib的使用了解:程序管理軟件SCCS\CVS6.1程序設計環(huán)境理想的程序設計環(huán)境單任務環(huán)境->單用戶、單進程多任務環(huán)境下的程序設計用戶程序不能直接控制系統(tǒng)的硬件設備用戶程序通過操作系統(tǒng)來控制系統(tǒng)的資源存儲中存在:用戶程序空間和系統(tǒng)空間程序程序程序系統(tǒng)核心空間(內核)6.2基于操作系統(tǒng)支持的程序設計建立系統(tǒng)編程的思想站在資源管理者的角度來分析問題,充分考慮系統(tǒng)為用戶程序提供哪些服務和資源,以實現(xiàn)對系統(tǒng)資源的有效利用——嵌入式系統(tǒng)系統(tǒng)調用用戶程序通過系統(tǒng)調用實現(xiàn)對系統(tǒng)內核功能的使用及對各種硬件資源的訪問了解:系統(tǒng)調用的使用方法輸入、輸出控制類進程、線程管理類:創(chuàng)建、終止、同步、互斥等內存及輔存管理類6.2基于操作系統(tǒng)支持的程序設計設備控制類本地進程通信管理類網(wǎng)絡進程通信管理類系統(tǒng)調用與庫函數(shù)的關系系統(tǒng)調用是操作系統(tǒng)層面提供的服務,庫函數(shù)是高級語言提供的服務用戶程序庫函數(shù)用戶程序系統(tǒng)調用6.3在UNIX中完成C程序開發(fā)編程語言低級語言機器語言:能夠由機器直接執(zhí)行。匯編語言:包含一些助記符,需要由匯編程序將其翻譯成機器語言。高級語言:需要由編譯程序和解釋語言將其翻譯成機器語言COBOL、BASIC、C/C++、PASCAL、FORTRAN、JAVA6.3在UNIX中完成C程序開發(fā)建立可執(zhí)行程序的步驟建立源文件建立目標文件建立可執(zhí)行文件源代碼目標代碼:由編譯程序和解釋程序把源代碼翻譯成機器能夠理解的語言。目標代碼不是可執(zhí)行文件,它還缺少庫文件??蓤?zhí)行代碼可能包含其它程序代碼,由鏈接程序將目標代碼和其它程序代碼鏈接在一起,形成完整的可執(zhí)行程序庫文件指的是為用戶程序和操作系統(tǒng)之間提供接口的程序6.3在UNIX中完成C程序開發(fā)區(qū)別編譯程序和解釋程序編譯程序:把高級語言翻譯成機器語言。它一次編譯所有的程序代碼,在編譯完成之前沒有任何結果反饋;解釋程序:把高級語言翻譯成機器語言。它一次翻譯一行代碼,并立即將執(zhí)行結果反饋。編譯程序產(chǎn)生更好且效率更高的目標代碼;解釋程序在每次執(zhí)行時都會重新解釋源代碼,效率較低Linux中的C/C++編譯程序是GCCLinux中的SHELL解釋程序是BASH6.3.1GCC:C/C++編譯器GCC(GNUCCompiler)是GNU推出的功能強大、性能優(yōu)越的多平臺編譯器,gcc編譯器能將C、C++語言源程序、匯編語言和目標程序編譯、鏈接成可執(zhí)行文件,以下是gcc支持編譯的一些源文件的后綴及其解釋(點擊)使用gcc將C源代碼文件生成可執(zhí)行文件,需要經(jīng)歷4個相關的步驟:預處理,編譯,匯編,鏈接預處理鏈接編譯組譯源程序(*.c)可執(zhí)行文件預處理器編譯器組譯器鏈接器gcc支持編譯的源文件后綴GCC的使用方法gcc的基本用法: gcc[選項][文件名列表]
gcc的選項說明:-c 只編譯并生成目標文件(.o)-g 生成調試信息-ofile 指定生成的文件名這里的文件名列表指的是需要編譯和鏈接的文件,例如C,C++源文件,目標文件,匯編程序代碼等。gcc的選項非常多,可以使用mangcc來查看,我們經(jīng)常使用的選項是-c-g-ogcc命令的常用選項幾個簡單的C程序實例hello.cgcc-ohellohello.c./hello計算階乘的程序將多個源程序編譯成一個可執(zhí)行文件gcc-ofactorialfactorial_main.cfactorial.c./factorialn編譯一個C++程序GCC編譯器可通過后綴名判斷c(.c)或c++程序(.C/.cpp),使用g++進行編譯g++-ohello_Chello.cpp改正錯誤及重定向標準錯誤如果源程序有誤,希望將錯誤信息重定向到某個文件,以便于逐一糾錯,可使用如下語句gcchello_error.c-ohello_error2>error重定向標準錯誤1>file:標準輸出設備的重定向2>file:標準錯誤輸出的重定向[root@stu1no10]#caterrorhello_error.c:Infunction`main':hello_error.c:9:syntaxerrorbefore"printf"6.3.2GNUmake和makefile文件GNUmakemakefile基本結構makefile變量GNUmake的主要預定義變量隱含規(guī)則makefile范例運行makeGNUmake利用make工具來自動完成編譯工作。這些工作包括:如果僅修改了某幾個源文件,則只重新編譯這幾個源文件;如果某個頭文件被修改了,則重新編譯所有包含該頭文件的源文件。利用這種自動編譯可大大簡化開發(fā)工作,避免不必要的重新編譯。make工具通過一個稱為makefile的文件來完成并自動維護編譯工作。makefile需要按照某種語法進行編寫,其中說明了如何編譯各個源文件并鏈接生成可執(zhí)行文件,并定義了源文件之間的依賴關系。當修改了其中某個源文件時,如果其他源文件依賴于該文件,則也要重新編譯所有依賴該文件的源文件。GNUmake默認情況下,GNUmake工具在當前工作目錄中按如下順序搜索makefileGNUmakefilemakefileMakefile在UNIX系統(tǒng)中,習慣使用Makefile作為makefile文件。如果要使用其他文件作為makefile,則可利用類似下面的make命令選項指定makefile文件:make-fMakefile.debugmakefile的基本結構makefile中一般包含如下內容:需要由make工具創(chuàng)建的項目,通常是目標文件和可執(zhí)行文件。通常使用“目標(target)”一詞來表示要創(chuàng)建的項目。要創(chuàng)建的項目依賴于哪些文件;創(chuàng)建每個項目時需要運行的命令;
例子:假設你現(xiàn)在有一個C++源文件test.C,該源文件包含有自定義的頭文件test.h,則目標文件test.o明確依賴于兩個源文件:test.C和test.h。另外你可能只希望利用g++命令來生成test.o目標文件。這時就可以利用如下的makefile來定義test.o的創(chuàng)建規(guī)則
Makefile基本結構實例1演示:例1當test.C或test.h文件在編譯之后又被修改,則make工具可自動重新編譯test.o,如果在前后兩次編譯之間,test.C和test.h均沒有被修改,而且test.o還存在的話,就沒有必要重新編譯。test.o:test.Ctest.h g++-c-gtest.C指定test.o為目標依賴文件指定了如何從目標所依賴的文件建立目標Makefile基本結構一個makefile文件中可定義多個目標,利用maketarget命令可指定要編譯的目標,如果不指定目標,則使用第一個目標。通常,makefile中定義有clean目標,可用來清除編譯過程中的中間文件,例如:clean: rm-f*.o運行makeclean時,將執(zhí)行rm-f*.o命令,最終刪除所有編譯過程中產(chǎn)生的所有中間文件。makefile實例2Network:Subrs.onetwork.ogcc-oNetworkSubrs.onetwork.oSubrs.o:Subrs.cNetdefs.hgcc-cSetwork.o:network.cNetdefs.hgcc-cnetwork.cclean:rm-f*.o演示:例2Makefile變量GNU的make工具除提供有建立目標的基本功能之外,還有許多便于表達依賴性關系以及建立目標的命令的特色。其中之一就是變量或宏的定義能力。如果你要以相同的編譯選項同時編譯十幾個C源文件,而為每個目標的編譯指定冗長的編譯選項的話,將是非常乏味的。但利用簡單的變量定義,可避免這種乏味的工作#Definemacrosfornameofcompiler CC=gcc#DefineamacrofortheCCflags CFLAGS=-c-g#Aruleforbuildingaobjectfiletest.o:test.ctest.h $(CC)$(CFLAGS)test.c
GNUmake的主要預定義變量GNUmake有許多預定義的變量,這些變量具有特殊的含義,可在規(guī)則中使用。表1-5給出了一些主要的預定義變量,除這些變量外,GNUmake還將所有的環(huán)境變量作為自己的預定義變量。
GNUmake的主要預定義變量隱含規(guī)則(1)GNUmake包含有一些內置的或隱含的規(guī)則,這些規(guī)則定義了如何從不同的依賴文件建立特定類型的目標。GNUmake支持兩種類型的隱含規(guī)則:后綴規(guī)則(SuffixRule):后綴規(guī)則是定義隱含規(guī)則的老風格方法。后綴規(guī)則定義了將一個具有某個后綴的文件(例如,.c文件)轉換為具有另外一種后綴的文件(例如,.o文件)的方法。每個后綴規(guī)則以兩個成對出現(xiàn)的后綴名定義,例如,將.c文件轉換為.o文件的后綴規(guī)則可定義為: .c.o: $(CC)$(CFLAGS)$(CPPFLAGS)-c-o$@$<隱含規(guī)則(2)模式規(guī)則(patternrules):這種規(guī)則更加通用,因為可以利用模式規(guī)則定義更加復雜的依賴性規(guī)則。模式規(guī)則看起來非常類似于正則規(guī)則,但在目標名稱的前面多了一個%號,同時可用來定義目標和依賴文件之間的關系,例如下面的模式規(guī)則定義了如何將任意一個x.c文件轉換為x.o文件: %.c:%.o $(CC)$(CFLAGS)$(CPPFLAGS)-c-o$@$<make運行GNUmake命令還有一些其他選項makefile范例根據(jù)圖示依賴關系編寫一個makefile文件,依賴關系圖如下:演示:例3make的實例ns.exe:link.onode.ons.o
gcc-ons.exelink.onode.ons.olink.o:link.clink.h.config.h gcc-clink.c node.o:ode.hconfig.h gcc-cnode.c ns.o:s.hconfig.h gcc-cns.c clean: rm-f*.o 使用automake和autoconf產(chǎn)生makefile在開始使用automake和autoconf之前,請先確認系統(tǒng)已經(jīng)安裝以下的軟件:GNUautomakeGNUautoconfGNUm4PerlGNULibtool(如果你需要產(chǎn)生sharedlibrary)automake所產(chǎn)生的makefile除了可以做到程序的編譯和鏈接,也已經(jīng)把如何產(chǎn)生程序文件的操作,以及把安裝程序都考慮進去了,所以源程序所存放的目錄架構最好符合GNU的標準慣例,下面用hello.c來作為例子進行說明。使用automake和autoconf產(chǎn)生makefile在工作目錄下建立一個新的子目錄4,再在4下建立一個hello的子目錄,這個目錄將作為存放hello這個程序及其相關文件的地方:#include<stdio.h>intmain(intargc,char**argv){printf("Hello,GNU!\n");return0;}演示:例4使用automake和autoconf產(chǎn)生makefile具體步驟autoscan產(chǎn)生一個configure.in的模板,執(zhí)行autoscan后會產(chǎn)生一個configure.scan的文件,可以用它做為configure.in文件的模板:編輯configure.scan文件,如下所示,并且把文件名改成configure.in執(zhí)行aclocal和autoconf,分別會產(chǎn)生aclocal.m4及configure兩個文件:編輯Makefile.am文件,內容如下:執(zhí)行automake--add-missing,Automake會根據(jù)Makefile.am產(chǎn)生一些文件,包含最重要的Makefile.in:使用automake和autoconf產(chǎn)生makefile最后執(zhí)行./configure:現(xiàn)在你的目錄下已經(jīng)產(chǎn)生了一個Makefile文件,執(zhí)行make命令就可以開始編譯hello.c成執(zhí)行文件,最后執(zhí)行./hello:#makegcc-DPACKAGE="hello"-DVERSION="1.0"-I.-I.-g-O2-chello.cgcc-g-O2-ohellohello.o#./helloHello!GNU!6.3.3GDB:Linux調試工具Linux系統(tǒng)中包含了GNU調試程序gdb,它是一個用來調試C和C++程序的調試器。可以使程序開發(fā)者在程序運行時觀察程序的內部結構和內存的使用情況。gdb所提供的一些功能如下所示:運行程序,設置所有的能影響程序運行的參數(shù)和環(huán)境;控制程序在指定的條件下停止運行;當程序停止時,可以檢查程序的狀態(tài);修改程序的錯誤,并重新運行程序;動態(tài)監(jiān)視程序中變量的值;可以單步執(zhí)行代碼,觀察程序的運行狀態(tài)。
GDB調試說明gdb程序調試的對象是可執(zhí)行文件,而不是程序的源代碼文件。如果要讓產(chǎn)生的可執(zhí)行文件可以用來調試,需在執(zhí)行gcc指令編譯程序時,加上-g參數(shù),指定程序在編譯時包含調試信息。調試信息包含程序里的每個變量的類型和在可執(zhí)行文件里的地址映射以及源代碼的行號。gdb利用這些信息使源代碼和機器碼相關聯(lián)。可在makefile中如下定義CFLAGS變量:CFLAGS=-g[root@stu1no10]#
gcc-ghello_error.c-ohello_error[root@stu1no10]#gdbGDB的幫助在gdb提示符處鍵入help,將列出命令的分類,鍵入help后跟命令的分類名,可獲得該類命令的詳細清單。如果想要了解某個具體命令(比如break)的幫助信息,在gdb提示符下輸入下面的命令:helpbreak break的作用是設置斷點aliases:命令別名breakpoints:斷點定義data:數(shù)據(jù)查看iles:指定并查看文件internals:維護命令running:程序執(zhí)行stack:調用棧查看statu:狀態(tài)查看tracepoints:跟蹤程序執(zhí)行。另一個獲得gdb幫助的方法是瀏覽gdb的手冊頁。#mangdbGDB的常用命令gdb的基本命令 gdbfilename其中filename是要調試的可執(zhí)行文件。用這種方式運行gdb可以直接指定想要調試的程序。這和啟動gdb后執(zhí)行filefilename命令效果完全一樣。gdb支持很多的命令且能實現(xiàn)不同的功能。這些命令從簡單的文件裝入到允許你檢查所調用的堆棧內容的復雜命令,下面列出了在使用gdb調試時會用到的一些命令。file命令:裝入想要調試的可執(zhí)行文件cd命令:改變工作目錄gdb常用命令pwd命令:打印當前工作日錄。run命令:執(zhí)行當前被調試的程序。list命令:列出正在調試的應用程序的源代碼。break命令:設置斷點。kill命令:停止正在調試的應用程序。tbreak命令;設置臨時斷點。它的語法與break相同。區(qū)別在于用tbreak設置的斷點執(zhí)行一次之后立即消失。watch命令:設置監(jiān)視點,監(jiān)視表達式的變化。continue命令:繼續(xù)正在執(zhí)行調試的程序。該命令用在程序由于處理信號或斷點而導致停止運行的情況。gdb常用命令awatch命令:設置讀寫監(jiān)視點。當要監(jiān)視的表達式被讀或寫時將應用程序掛起。它的語法與watch命令相同。rwatch命令:設置讀監(jiān)視點,當監(jiān)視表達式被讀時將程序掛起,等侍調試。此命令的語法與watch相同。next命令:執(zhí)行下一條源代碼,但是不進入函數(shù)內部。也就是說,將一條函數(shù)調用作為一條語句執(zhí)行。執(zhí)行這個命令的前提是已經(jīng)run,開始了代碼的執(zhí)行。gdb常用命令step命令:執(zhí)行下一條源代碼,進入函數(shù)內部。如果調用了某個函數(shù),會跳到函數(shù)所在的代碼中等候一步步執(zhí)行。執(zhí)行這個命令的前提是已經(jīng)用run開始執(zhí)行代碼。display命令:在應用程序每次停止運行時顯示表達式的值。infobreak命令:顯示當前斷點列表,包括每個斷點到達的次數(shù)infofiles命令:顯示調試文件的信息。infofunc命令:顯示所有的函數(shù)名。gdb常用命令infolocal命令:顯示當前函數(shù)的所有局部變量的信息。infoprog命令:顯示調試程序的執(zhí)行狀態(tài)。print命令;顯示表達式的值。delete命令:刪除斷點。指定一個斷點號碼,則刪除指定斷點。不指定參數(shù)則刪除所有的斷點。Shell命令:執(zhí)行LinuxShell命令。make命令:不退出gdb而重新編譯生成可執(zhí)行文件。quit命令:退出gdb。GDB的簡單實例#include<stdio.h>staticcharbuff[256];staticchar*string;intmain(){printf("pleaseinputastring:\n");gets(string);printf("yourstringis:%s\n",string);}上面程序的目的是接受用戶的
溫馨提示
- 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è)安全生產(chǎn)許可證頒發(fā)與管理作業(yè)指導書
- 反擔保合同協(xié)議1
- 游戲美術設計制作實戰(zhàn)手冊作業(yè)指導書
- 針紡織品銷售購銷合同
- 小學二年級數(shù)學上冊口算
- 2025年紹興a2貨運從業(yè)資格證模擬考試題
- 2024-2025學年高中語文專題一小說家想說些什么第1課在酒樓上學案蘇教版選修短篇小說蚜
- 七年級班級工作總結
- 四年級第一學期德育工作計劃
- 帶狀皰疹與帶狀皰疹后遺神經(jīng)痛(HZ與PHN)
- 漢密爾頓抑郁和焦慮量表
- 風電場事故案例分析
- 前列腺癌的診斷與治療
- 人教版八年級數(shù)學初中數(shù)學《平行四邊形》單元教材教學分析
- EPC項目設計及施工的配合
- 年產(chǎn)5萬噸1,4-丁二醇的工藝流程設計
- 八年級上冊-2024年中考歷史總復習核心考點與重難點(部編版)
- 醫(yī)院科室人才建設規(guī)劃方案
- 儲油罐安全操作規(guī)程培訓
- 護理飲食指導整改措施及方案
評論
0/150
提交評論