【文章內(nèi)容簡介】
南京工程學(xué)院畢業(yè)設(shè)計(jì)說明書(論文) 第 4頁 為什么選擇 Linux 。質(zhì)量和可依賴性是衡量代碼優(yōu)劣的重要標(biāo)準(zhǔn)。盡管在 “ quality code”眾說紛紜,但是大多數(shù)編程人員所期望的都有如下幾點(diǎn): (1)模塊化:每一個功能都寫成一個模塊,這樣不僅易于讀寫,更加方便以后的移植; (2)可讀性:一段代碼應(yīng)該能讓別人看的下去,這里包括變量的定義,盡量取有意義的變量名,避免 int i, j 這樣的定義;一段雜亂的讓人看一眼就不想往下看的代碼一定是不好的,不管功能有多牛。; (3)可擴(kuò)展性:在增加新的功能時(shí),不要對原來的代碼進(jìn)行大篇幅的修改,而是只要添加對應(yīng)的功能即可; (4)可配置性:可以選擇對應(yīng)的功能特色進(jìn)行編譯,不要的就不編譯,從而生成的程序適合自己的使用。但是配置的過程應(yīng)該盡量簡單人性化。 ,是 Inter最基本的協(xié)議、是 Inter 國際互聯(lián)網(wǎng)絡(luò)的基礎(chǔ)。 Socket 通信所采用的協(xié)議分為面向連接 (TCP)和非面向連接 (UDP)的兩種 ,但由于 UDP 效率較高但是傳輸不可靠,不能勝任復(fù)雜的網(wǎng)絡(luò)環(huán)境,不得不通過超時(shí)和重傳等手段來實(shí)現(xiàn)較高的可靠性;然而 TCP 在數(shù)據(jù)傳輸方面提供了完全的可靠性,因此選用 TCP/IP協(xié)議更加可靠些。 。 Linux kernel 源碼及所有的開發(fā)和編譯工具是很方便從網(wǎng)絡(luò)上獲取的。 Linux 中最重要的部分 Linux kernel 分布在 GPL 下。其他的代碼也分布在相同的證書下,如 BSD 等。構(gòu)成 Linux 的大部分代碼都是沒有限制的。當(dāng)源碼的訪問受限時(shí),開放自由軟件組織就會尋找新版本的源碼包代替原有的代碼。正是由于這一特性, Linux 受到很多電話制造商的青睞,他們將其移植到自己產(chǎn)品中,稍作修改優(yōu)化使其適合自己的產(chǎn)品。 。 Linux 支持不同種類的硬件平臺和設(shè)備,盡管有些驅(qū)動暫不支持 Linux 系統(tǒng),但是對此有很大的期待。因?yàn)楹芏囹?qū)動都由 Linuxshequ 維護(hù)著,你可以毫無顧忌的使用這些驅(qū)動。各種硬件協(xié) 同工作,使你的工作更加順暢。你希望在你自己電腦上編寫的程序能夠在 另一架構(gòu)的操作系統(tǒng)上正常南京工程學(xué)院畢業(yè)設(shè)計(jì)說明書(論文) 第 5頁 運(yùn)行,甚至有不同的設(shè)備驅(qū)動運(yùn)行在不同的系統(tǒng)架構(gòu)上。 。 Linux提供了廣泛的通信協(xié)議和標(biāo)準(zhǔn)的軟件支持。這使得整合 Frameworks 及相關(guān)軟件到 Linux 上變得更加容易。同時(shí), Linux是 Ulike 的,可以方便的將 UNIX程序移植到 Linux 上。事實(shí)上,許多應(yīng)用被綁定在一些商用 Unixes 中,繼而被移植到 Linux 中。 論文的主要工作 第一章:緒論 ,大體介紹 Linux 操作系統(tǒng)發(fā)展、應(yīng)用的現(xiàn)狀以及我們選擇Linux 系統(tǒng)的原因; 第二章:介紹 Linux 軟件開發(fā)中使用的編譯工具和調(diào)試工具及其簡單的使用方法; 第三章: 介紹設(shè)計(jì)是怎樣實(shí)現(xiàn)的以及在實(shí)現(xiàn)的過程中用到了哪些關(guān)鍵技術(shù)并對這些關(guān)鍵技術(shù)作簡要分析; 第四章: 介紹設(shè)計(jì)相關(guān)的主要代碼的實(shí)現(xiàn)過程,依次對服務(wù)器和客戶端主要流程進(jìn)行介紹,必要的功能展示; 第五章: 設(shè)計(jì)總結(jié)與展望 南京工程學(xué)院畢業(yè)設(shè)計(jì)說明書(論文) 第 6頁 第二章 Linux 編程常用工具 嵌入式 C 語言 C 語言 最初是 由貝爾實(shí)驗(yàn)室 的職員 Thompson 和 Ritchie 于 1971 年共同開發(fā)。 其應(yīng)用場景很多,如: 操作系統(tǒng) :Linux; 微控制器 :汽車和航天飛機(jī); 嵌入式處理器:電話和便攜式電子設(shè)備等; DSP Processer:數(shù)字音頻圖像處理和 TV 系統(tǒng)等。 程序的生成過程如圖 所示 : 圖 程序的生成過程 C 語言能夠在編程開發(fā)領(lǐng)域受到如此高的青睞, 主要有以下幾個 方面的 原南京工程學(xué)院畢業(yè)設(shè)計(jì)說明書(論文) 第 7頁 因: 。因而在跨平臺開發(fā)時(shí)非常方便, C 語言的這一特性吸引著廣大編程愛好者; 。可以指定編譯選項(xiàng)從而省去中間過程,以進(jìn)一步提升程序的執(zhí)行效率。 。由于各個平臺的差異,當(dāng)一個程序到不同平臺上,只需要從新編譯一下源代碼即可使用; 。 C 語言發(fā)展較快。在上世紀(jì) 80 年代末期由 American National Institude 發(fā)布的 ANSI C 的 C 語言標(biāo)準(zhǔn)奠定了其發(fā)展的基石。 GCC 工具鏈 GNU/Linux 操作 系統(tǒng)上往往 使用 gcc 作為編譯工具 。其不是一個單獨(dú)的程序,而是多個程序的組合,因而通常稱為 toolchain(工具鏈 )。 GCC 的 全稱 是 GNU Complier Collection,是由 GNU Project 提供的支持多 種編程語言的編譯器。 GCC 是 GNU toolchain 中的重要組成部分, GCC 作為一個工具和實(shí)例,在自由軟件的成長過程中扮演著重要的作用。同年 12 月, GCC擴(kuò)展到能夠編譯 C++,不久之后能夠支持的語言更多,如 ObjectiveC、ObjectiveC++、 Fortran、 Java 和 Ada 等等。 GCC 被移植到多種架構(gòu)的處理器,并作為一種專業(yè)軟件開發(fā)工具配置于系統(tǒng)中。 GCC 同時(shí)也集成于大多數(shù)嵌入式平臺,包括 Symbian, AMCC等 。作為 GNU操作系統(tǒng)官方 指定 編譯器, GCC被其他 Ulike操作系統(tǒng)吸收采用,包括 Linux和 BSD 家族。 程序的編譯過程 如圖 所示 : 南京工程學(xué)院畢業(yè)設(shè)計(jì)說明書(論文) 第 8頁 頭文件匯編源文件c 源文件C ++ 源文件預(yù)處理器預(yù)處理器預(yù)處理器預(yù)處理后的C 文件預(yù)處理后的C ++ 文件C ++ 編譯器匯編文件C 編譯器匯編器匯編器匯編文件匯編文件匯編器目標(biāo)文件目標(biāo)文件目標(biāo)文件鏈接器共享庫可執(zhí)行程序*. h*. s*. c*. c p p*. cc*. icppgcccppcpp *. ii *. s*. s*. s*. o*. o*. oa p p*. sog ++asasasld 圖 源碼到可執(zhí)行文件的過程 GCC的用法 對于 GCC 的編譯選項(xiàng)只要掌握一些常用的選項(xiàng)就可以,其他多大 100多種選項(xiàng)有些工程師可能一輩子也不會用到。 gcc 基本用法: gcc [Wall] [O1..3] [g] [o name] file... Wall: 打開所有警告項(xiàng) O: 設(shè)置優(yōu)化級別, O0 表示關(guān)閉優(yōu)化功能 g: 將調(diào)試信息編譯到目標(biāo)文件中 o name: 指定輸出文件的名稱是 name file: 被編譯 (鏈接 )的文件 調(diào)試和剖析選項(xiàng) gcc – g:以本機(jī)格式 (stabs,COFF,XCOFF,or DWARF 2)生成調(diào)試信息供 gdb使用。 在大多數(shù)系統(tǒng)上, “ g”產(chǎn)生的調(diào)試信息只能供 GDB 使用,這種調(diào)試信息在 gdb 中能很好的工作,而在其他調(diào)試器上不是讀取不了就是調(diào)試器異常崩南京工程學(xué)院畢業(yè)設(shè)計(jì)說明書(論文) 第 9頁 潰。如果你想指定調(diào)試信息的格式,可通過如下方式: gstabs+、 gstabs、 gxcoff+、 gxcoff、 gvms gcc 允許同時(shí)使用 ‘ g’ 、 ‘ – o’ ,這種使用方法將會產(chǎn)生令你意想不到的效果:你定義的一些變量可能不存在、程序會跑飛掉、一些語句不會被執(zhí)行。不管是否提供可能的優(yōu)化輸出,但可以肯定的是,這將會產(chǎn)生一些 bug。 但是這種方法 使得你能夠在和最終產(chǎn)品盡可能相同的情況下對代碼進(jìn)行調(diào)試。 應(yīng)當(dāng)注意 , 如果你同時(shí)使用這兩個編譯選項(xiàng) ,必須清楚所寫的某些 有關(guān)代碼已經(jīng)在優(yōu)化時(shí)被 GCC 作了 些改變 。 GDB 調(diào)試器 GDB(GNU Debuger),是 GNU 操作系統(tǒng)的標(biāo)注調(diào)試器;。 GDB作為 GNU 系統(tǒng)的一部分于 1986年由 Richard Stallman 編寫,是 GPL下的自由軟件 。使用者可以監(jiān)視和修改程序的內(nèi)部變量,甚至可以獨(dú)立地調(diào)用程式正常行為的函數(shù)。 GDB 能對多種不同處理器架構(gòu)上運(yùn)行出錯的應(yīng)用軟件排錯 ,這些處理器架構(gòu)包括: Alpha、 ARM、 AVR、 H8/300、 Altera Nios/Nios II、 System/370、 System 390、 X86 及其 64 位擴(kuò)展。 GDB 明顯的限制是在他的運(yùn)用方面,沒有較親和的圖形界面,預(yù)設(shè)只有命令行界面可用。 Gdb 是為了讓你能夠 “ 看到 ” 另一程序執(zhí)行時(shí)具體做了什么或者是另一程序崩潰時(shí)發(fā)生了什么 GDB 可以做四件事情幫助你找到程序中的 bug: (1) 啟動你的程序,指定任何可能影響其行為的變量或函數(shù)等; (2) 使你的程序暫停 (設(shè)置斷點(diǎn) )或者指定特定的狀態(tài); (3) 當(dāng)你的程序終止時(shí),檢測發(fā)生了什么; (4) 改變你程序中的事情,這樣你就可以嘗試糾正一個 bug 的影響以便繼續(xù)往下找另一個 bug。 GDB用法 gdb 的基本命令: gdb 提供 的 各種各樣的命令有著不同的功能。從簡單到復(fù)雜, 以下列出了南京工程學(xué)院畢業(yè)設(shè)計(jì)說明書(論文) 第 10頁 一些常用的 gdb 調(diào)試命令: (1)file filename:在 gdb 模式中無需退出即可通過 file 命令裝在你要調(diào)試的文件 (gdb) file david Reading symbols from /home/david/Graduation_projec t/david...(no debugging symbols found)...done. (2)kill:通過 kill 命令可以終止當(dāng)前正在調(diào)試的程序 (gdb) kill Kill the program being debugged? (y or n) y 還有一些常用的如: n(next)、 s(step)、 run 和 q(quit)將在下節(jié)例程中詳細(xì)說明。 用 gdb 調(diào)試 GCC 程序 在終端輸入 gdb 回車后,會出現(xiàn)如下一長串內(nèi)容 : david@zdz:Graduation_project$ gdb GNU gdb (Ubuntu/Linaro ) Copyright (C) 20xx Free Software Foundation, Inc. Lic ense GPLv3+: GNU GPL version 3 or later enses/ This is free software: you are free to c hange and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type show c opying and show w arranty for details. This GDB w as c onfigured as x86_64 linuxgnu. For bug reporting instructions, please see: (gdb) Gdb 的一些使用命令如果記不住的話可以查看官方手冊,沒必要硬記,準(zhǔn)其自然,每次不會的時(shí)候翻翻手冊,時(shí)間長了自然就記住了 下面只介紹一些常用的幾個命令: 比方說,現(xiàn)在有一個通過 gcc 編譯好的可執(zhí)行文件 david,在程序中我定南京工程學(xué)院畢業(yè)設(shè)計(jì)說明書(論文) 第 11頁 義了兩個變量 x, y 賦初值為 5, 6 終端執(zhí)行 david@zdz:Graduation_project$ ./david The result is: x + y is 11 x * y is 30 x / y is 0 那么通過 gdb 來看看發(fā)生了什么: david@zdz:Graduation_project$ gdb david (gdb) 我們現(xiàn)在告訴 gdb 使用窄于通常的顯示寬度: (gdb) set width 70 下面我要知到 david 這個程序怎樣工作的,通過閱讀源程序我大體知道工作流程,所以我可以設(shè)置斷點(diǎn): (gdb) break count Breakpoint 1 at 0x400579 接下來運(yùn)行程序: (gdb) run Starting program: /home/david/Graduation_project/david The result is: Breakpoint 1, 0x0000000000400579 in count () 可以發(fā)現(xiàn)程序停在 count()函數(shù)這個地方, The result is :這句話顯示count()函數(shù)之前都已運(yùn)行完畢。 現(xiàn)在我可以通過 n(next)讓程序執(zhí)行到下一行 (gdb) n Single stepping until exit from function count, which has no line number information. x + y