Linux環(huán)境C_程序設(shè)計(jì)_第1頁
Linux環(huán)境C_程序設(shè)計(jì)_第2頁
Linux環(huán)境C_程序設(shè)計(jì)_第3頁
Linux環(huán)境C_程序設(shè)計(jì)_第4頁
Linux環(huán)境C_程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩607頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第1章 linux系統(tǒng)概述和安裝,linux系統(tǒng)是一種類unix完整的操作系統(tǒng)。它不僅功能強(qiáng)大、運(yùn)行穩(wěn)定,而且用戶可免費(fèi)使用,分析其源代碼。linux系統(tǒng)支持x86、arm等大多數(shù)常見硬件架構(gòu)和tcp/ip等主流網(wǎng)絡(luò)協(xié)議,有良好的跨平臺(tái)性能,應(yīng)用面極其廣闊。本章將介紹linux系統(tǒng)的基本概念,并演示如何安裝一套帶有x window圖形操作界面的linux系統(tǒng)發(fā)布版。,1.1 引言,計(jì)算機(jī)系統(tǒng)由硬件系統(tǒng)和軟件系統(tǒng)所組成,軟件系統(tǒng)中最為重要的是操作系統(tǒng).。linux作為操作系統(tǒng)管理著計(jì)算機(jī)內(nèi)所有的硬件資源和軟件資源,仿佛是計(jì)算機(jī)的靈魂。linux系統(tǒng)基于gpl協(xié)議發(fā)布,該協(xié)議是gnu項(xiàng)目所創(chuàng)立開放

2、源代碼的公共許可證。要理解linux系統(tǒng)并以一種全新的方式開發(fā)和發(fā)布軟件,首先則需要了解gnu項(xiàng)目和linux系統(tǒng)的淵源。,1.1.1 gnu項(xiàng)目簡介,gnu項(xiàng)目在1983年由理查德斯托曼(richard stallman)所創(chuàng)立,最初的目標(biāo)是通過使用必要的工具從源代碼開始創(chuàng)建一個(gè)自由的類unix操作系統(tǒng)。此前的軟件均以源代碼的形式發(fā)布,用戶可以根據(jù)自己需要修改源代碼,但自從那時(shí)起,軟件廠商為了保護(hù)自己的商業(yè)利益,開始使用編譯所得的二進(jìn)制文件發(fā)布軟件,從而使軟件的源代碼變?yōu)椤吧虡I(yè)秘密”。,1.1.2 linux起源,安德魯塔能鮑姆(andrew tanenbaum)出于教學(xué)目的編寫了名為min

3、ix的類unix操作系統(tǒng)。1991年8月,林納斯將自己新設(shè)計(jì)的操作系統(tǒng)內(nèi)核通過網(wǎng)絡(luò)發(fā)布,命名為linux系統(tǒng)。不久之后,linux系統(tǒng)陸續(xù)推出了多個(gè)版本,并且吸引了更多開發(fā)者加入linux系統(tǒng)開發(fā)的行列。,1.1.3 linux發(fā)展現(xiàn)狀,如今,linux系統(tǒng)內(nèi)核版本已發(fā)布到2.6版,它代表著當(dāng)前操作系統(tǒng)技術(shù)的最前沿,并依然保持?jǐn)?shù)周內(nèi)一次的版本更新。更多的開發(fā)者進(jìn)入到linux系統(tǒng)開發(fā)的行列中,因此基于linux系統(tǒng)的軟件資源也十分豐富,而且這些資源同樣能免費(fèi)使用。 linux系統(tǒng)進(jìn)入我國的時(shí)間較早,我國的工程師對(duì)linux系統(tǒng)的發(fā)展也做出了巨大貢獻(xiàn)。所以,linux系統(tǒng)在我國擁有一定的用戶基礎(chǔ)

4、和大量中文資源。,1.1.4 免費(fèi)軟件與開源軟件,免費(fèi)軟件與開源軟件概念并不相同,免費(fèi)軟件通常以二進(jìn)制文件形式發(fā)布,用戶雖然可以免費(fèi)使用,但無權(quán)對(duì)軟件進(jìn)行任何修改。開源軟件是將軟件以源代碼形式發(fā)布,并遵循gpl等開源協(xié)議,用戶不僅能使用,而且還可對(duì)軟件進(jìn)行改進(jìn)。 linux系統(tǒng)是開源軟件,所以基于linux系統(tǒng)開發(fā)必須遵循開源規(guī)則。這種開發(fā)方式最大的優(yōu)勢是,開發(fā)者能最大限度的利用現(xiàn)有代碼,從而避免重復(fù)工作。,1.2 linux內(nèi)核與版本,linux內(nèi)核是該操作系統(tǒng)的核心程序文件,通過與其他程序文件組合,linux又構(gòu)成了許多版本。每種linux版本都有其特點(diǎn),例如嵌入式linux版本專門用于較

5、小的電子設(shè)備操作,而我們的計(jì)算機(jī)中常用的是linux桌面版和linux企業(yè)版。,1.2.1 linux內(nèi)核介紹,內(nèi)核是操作系統(tǒng)的心臟,系統(tǒng)其他部分必須依靠內(nèi)核這部分軟件提供的服務(wù),內(nèi)核由中斷服務(wù)程序、調(diào)度程序、內(nèi)存管理程序、網(wǎng)絡(luò)和進(jìn)程間通信等系統(tǒng)程序共同組成。,1.2.2 linux所支持的硬件平臺(tái),linux系統(tǒng)支持當(dāng)前所有主流硬件平臺(tái),能運(yùn)行在各種架構(gòu)的服務(wù)器,如intel的ia64、compaq的alpha、sun的sparc/sparc64、sgi的mips、ibm的s396;也能運(yùn)行在幾乎全部的工作站,如intel的x86、apple的powerpc。更吸引人的是支持嵌入式系統(tǒng)和移動(dòng)

6、設(shè)備,如arm,linux內(nèi)核短小精湛且功能全面,可根據(jù)特定硬件環(huán)境裁剪出具備適當(dāng)功能的操作系統(tǒng)。另外,無論是32位指令集系統(tǒng)還是64位指令集系統(tǒng),都能高效穩(wěn)定運(yùn)行。,1.2.3 常用linux版本,linux系統(tǒng)擁有多個(gè)發(fā)行版,它可能是由一個(gè)組織、公司或者個(gè)人發(fā)行。通常一個(gè)發(fā)行版包括linux內(nèi)核、將整個(gè)軟件安裝到計(jì)算機(jī)的安裝工具、適用特定用戶群的一系列g(shù)nu軟件。常用的linux發(fā)行版本如下: 1fedora桌面版 2ubuntu桌面版 3red hat服務(wù)器版 4opensuse 5debian,1.3 系統(tǒng)安裝,linux系統(tǒng)安裝是將安裝介質(zhì)內(nèi)的系統(tǒng)文件復(fù)制到設(shè)備的硬盤上。安裝前需要對(duì)

7、硬盤進(jìn)行分區(qū),linux系統(tǒng)擁有專門的分區(qū)結(jié)構(gòu)。安裝過程中l(wèi)inux系統(tǒng)還會(huì)進(jìn)行各種程序的配置,本節(jié)將講解linux發(fā)行版的安裝與配置。,1.3.1 安裝前準(zhǔn)備,安裝linux系統(tǒng)前,首先可根據(jù)用途和硬件平臺(tái)選擇一個(gè)linux發(fā)布版本,若讀者具備豐富的linux知識(shí)亦可從內(nèi)核開始編譯一個(gè)全新的linux版本。獲得linux發(fā)布版本可在因特網(wǎng)上直接下載,也可通過其他途徑獲得linux發(fā)布版的拷貝,這是gpl協(xié)議中的合法行為。安裝前需詳細(xì)了解該版本對(duì)系統(tǒng)的需求,以及安裝設(shè)備的硬件環(huán)境。linux系統(tǒng)可自動(dòng)識(shí)別大多數(shù)硬件設(shè)備,并為其找到合適的驅(qū)動(dòng)程序,但難免有些不常見的設(shè)備需要額外準(zhǔn)備驅(qū)動(dòng)程序。,1

8、.3.2 系統(tǒng)需求,各種linux版本有不同的系統(tǒng)需求,具體需求可在官方網(wǎng)站的安裝說明內(nèi)看到。得到系統(tǒng)需求列表后,可與安裝設(shè)備的硬件列表進(jìn)行對(duì)比,通常設(shè)備供應(yīng)商會(huì)提供設(shè)備上的具體硬件型號(hào)列表。下面是當(dāng)前流行的linux桌面版本最低系統(tǒng)需求: cpu:intel pentium兼容cpu,主時(shí)鐘頻率在400mhz以上。 內(nèi)存:256mb以上。 硬盤:至少3g空余空間。 顯卡:vga兼容或更高分辨率顯卡。 其他:有鼠標(biāo)、鍵盤、光驅(qū)等設(shè)備。,1.3.3 硬盤分區(qū),硬盤是常見的存儲(chǔ)設(shè)備,大多數(shù)計(jì)算機(jī)上都以硬盤作為主要的外儲(chǔ)存器。為了便于管理,linux系統(tǒng)允許將一塊硬盤劃分為多個(gè)分區(qū),或者將多塊硬盤劃

9、分為一個(gè)分區(qū)。分區(qū)的類型有三種,主分區(qū)(primary-partition)和擴(kuò)展分區(qū)(extended-partition)是頂層的分區(qū)體系,邏輯分區(qū)(logical-partition)是擴(kuò)展分區(qū)下的子結(jié)構(gòu)。同一塊硬盤上最多允許存在4個(gè)主分區(qū)和一個(gè)擴(kuò)展分區(qū),擴(kuò)展分區(qū)以下的邏輯分區(qū)數(shù)量并無限制。,1.3.4 圖形方式安裝linux,圖形化linux安裝程序?yàn)橛糜谔峁┝硕喾N安裝語言的選擇和更簡單易懂的安裝信息。本節(jié)介紹以fedora 10 live cd為媒介安裝linux系統(tǒng)的過程。live cd是linux系統(tǒng)最新的發(fā)布形式,它不但能直接以cd啟動(dòng)計(jì)算機(jī)進(jìn)入到linux系統(tǒng),還提供了圖形化

10、安裝程序。,1.3.5 升級(jí)最新內(nèi)核,為了使用linux系統(tǒng)最新的特性,可在安裝完成后對(duì)linux內(nèi)核進(jìn)行升級(jí)。各個(gè)發(fā)行版的linux系統(tǒng)都有軟件管理器提供自動(dòng)升級(jí)服務(wù),但也可以根據(jù)需要手動(dòng)升級(jí)內(nèi)核。fedora和red hat企業(yè)版可使用yum軟件管理器升級(jí)內(nèi)核,在終端輸入下列命令: su / 獲取根用戶權(quán)限,將提示輸入根用戶密碼 yum update kernel / 升級(jí)內(nèi)核,1.3.6 安裝中文支持,大多數(shù)的linux發(fā)行版都提供了多語言支持,并根據(jù)用戶選擇自動(dòng)安裝中文支持。中文支持通常包括中文字符編碼、中文字庫、軟件的中文ui包和中文輸入法。如果linux安裝完成后沒有安裝中文支持,

11、可手動(dòng)安裝。中文支持的安裝信息可查閱該發(fā)行版的中文社區(qū)。,1.4 小結(jié),本章介紹了linux系統(tǒng)的基本概念和安裝方法,linux系統(tǒng)是一個(gè)開放的操作系統(tǒng),理解了gnu項(xiàng)目后可快捷的開發(fā)各種軟件。在學(xué)習(xí)后面的章節(jié)前,讀者可根據(jù)自身需要安裝一套linux操作系統(tǒng),以便實(shí)踐各種開發(fā)技能。,第2章 linux基本操作,linux系統(tǒng)有兩種操作方法,一種是使用鼠標(biāo)鍵盤等輸入設(shè)備直接在圖形界面x window上操作,另一種是通過輸入文本命令方式在控制臺(tái)上操作。各種linux發(fā)行版的操作遵循同樣的原則,所以操作方法非常相似。,2.1 登錄,安裝有圖形界面的linux系統(tǒng)啟動(dòng)后會(huì)直接進(jìn)入到x window中,

12、并提示輸入用戶名和密碼登錄。第一次登入可能需用創(chuàng)建一個(gè)新用戶,該用戶只是一個(gè)普通用戶,不能直接進(jìn)行系統(tǒng)配置。有些時(shí)候需要在控制臺(tái)上登錄,則直接輸入用戶名和密碼即可。,2.1.1 shell程序,shell是一種具備特殊功能的程序,也是介于用戶和linux內(nèi)核間的一個(gè)接口。linux系統(tǒng)擁有多種shell,發(fā)行版中常用的是名為bash的shell。這種shell不但能執(zhí)行簡單的命令,還能將多個(gè)命令、條件和參數(shù)編寫為程序執(zhí)行。,2.1.2 控制臺(tái),linux系統(tǒng)是一個(gè)多用戶多任務(wù)的分時(shí)操作系統(tǒng),任何一個(gè)要使用系統(tǒng)資源的用戶都必須先向系統(tǒng)管理員申請(qǐng)一個(gè)賬號(hào),然后以這個(gè)賬號(hào)的身份進(jìn)入系統(tǒng),該賬號(hào)的名稱

13、就是登錄名。linux系統(tǒng)通常有多個(gè)控制臺(tái),進(jìn)入控制臺(tái)后可使用shell程序操作計(jì)算機(jī)。,2.1.3 終端,終端是x window里訪問shell程序的接口。在gnome桌面上打開終端的方式為,選擇“應(yīng)用程序”|“系統(tǒng)工具”|“終端”命令。,2.2 文件和目錄,文件系統(tǒng)是在物理存儲(chǔ)設(shè)備中存放數(shù)據(jù)的索引格式,文件和目錄是數(shù)據(jù)的邏輯劃分形式。在linux系統(tǒng)中,文件的準(zhǔn)確定義是不包含任何其他結(jié)構(gòu)的數(shù)據(jù)流。linux系統(tǒng)的文件類型概況起來可分為五種,分別是:普通文件、目錄文件、鏈接文件、設(shè)備文件和管道文件。,2.2.1 文件系統(tǒng),文件系統(tǒng)是磁盤及其邏輯分區(qū)的目錄結(jié)構(gòu),一個(gè)磁盤設(shè)備可包含一個(gè)或多個(gè)文件

14、系統(tǒng),但每個(gè)文件系統(tǒng)必須占據(jù)硬盤中單獨(dú)的一個(gè)分區(qū),如圖2.3所示。,2.2.2 文件名,linux系統(tǒng)的文件名由字符和數(shù)字組成,其中字符可以是大小寫英文字母或其他unicode編碼的文字和符號(hào)。但不能包括“*”、“?”和“ ”文件名通配符。linux系統(tǒng)的文件名也有類似其他操作系統(tǒng)的擴(kuò)展名,在文件名最后一個(gè)“.”后的內(nèi)容即是擴(kuò)展名。例如,c語言源文件的擴(kuò)展名是以“.c”,頭文件的擴(kuò)展名是“.h”。,2.2.3 路徑名,linux文件系統(tǒng)采用帶鏈接的樹形目錄結(jié)構(gòu),即只有一個(gè)根目錄。根目錄可含有下級(jí)子目錄或文件;子目錄中又可含有更下級(jí)的子目錄或者文件。這樣一層一層地延伸下去,構(gòu)成一棵倒置的樹,如圖

15、2.4所示。,2.2.4 工作目錄,控制臺(tái)或終端在某個(gè)時(shí)刻總是對(duì)應(yīng)著一個(gè)目錄,該目錄即工作目錄。在控制臺(tái)或終端執(zhí)行命令或程序,對(duì)某個(gè)沒有指定路徑的文件或子目錄進(jìn)行操作,控制臺(tái)或終端會(huì)自動(dòng)在文件或子目錄前加入當(dāng)前工作目錄的路徑。例如,執(zhí)行“l(fā)s”命令會(huì)將工作目錄下的文件和子目錄名稱顯示出來,除非在“l(fā)s”命令后輸入某一具體的路徑名稱。工作目錄可用“.”表示,工作目錄上層父目錄用“.”表示?!癱d”命令用于改變工作目錄。,2.2.5 起始目錄,用戶通過控制臺(tái)或終端登錄時(shí),起始目錄為用戶的主目錄。默認(rèn)情況下,起始目錄是用戶主目錄,通常是“/home”目錄中與用戶的登錄名相同的一個(gè)子目錄。起始目錄可用

16、“”符號(hào)表示。例如,無論當(dāng)前工作目錄為何處,下列命令都能用于顯示起始目錄下的文件或主目錄: ls / 顯示起始目錄下所有的文件名與子目錄名 控制臺(tái)或終端會(huì)將“”符號(hào)替換成用戶起始目錄的絕對(duì)路徑,該符號(hào)也被認(rèn)為是環(huán)境變量,linux系統(tǒng)會(huì)自動(dòng)維護(hù)“”符號(hào)的值。,2.3 輸入和輸出,linux系統(tǒng)的輸入和輸出功能由linux內(nèi)核提供,內(nèi)核管理著所有的輸入與輸出設(shè)備,這些設(shè)備以設(shè)備文件的形式存在,保存在“/dev”目錄中。所有運(yùn)行在linux系統(tǒng)上的應(yīng)用程序必須通過linux內(nèi)核進(jìn)行輸入與輸出操作,本節(jié)簡單介紹linux內(nèi)核的輸入和輸出概念。,2.3.1 文件描述符,文件描述符是一個(gè)小的非負(fù)整數(shù),內(nèi)

17、核用以標(biāo)識(shí)某一特定進(jìn)程正在存訪的文件。當(dāng)內(nèi)核打開一個(gè)現(xiàn)存文件或創(chuàng)建一個(gè)新文件時(shí),它會(huì)返回一個(gè)文件描述符給該進(jìn)程,這樣該進(jìn)程就能通過內(nèi)核訪問目標(biāo)文件。,2.3.2 標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤,按慣例,每當(dāng)運(yùn)行一個(gè)新程序時(shí),所有的shell都為其打開三個(gè)文件描述符:標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出以及標(biāo)準(zhǔn)錯(cuò)誤。如果像簡單命令ls那樣沒有做什么特殊處理,則這三個(gè)描述符都連向終端。大多數(shù)shell均提供同一種描述方法,這樣可以使任何一個(gè)或所有這三個(gè)描述符都能重新定向到某一個(gè)文件,例如: # ls file.list 執(zhí)行l(wèi)s命令,其標(biāo)準(zhǔn)輸出重新定向到名為file.list的文件上。,2.3.3 標(biāo)準(zhǔn)輸入輸出函數(shù),

18、標(biāo)準(zhǔn)輸入輸出函數(shù)提供一種對(duì)不用緩存的輸入輸出函數(shù)的緩存機(jī)制。使用標(biāo)準(zhǔn)輸入輸出函數(shù)的優(yōu)點(diǎn)是無需擔(dān)心如何選取最佳的緩存長度,另一個(gè)優(yōu)點(diǎn)與處理輸入行有關(guān)(常常發(fā)生在linux的應(yīng)用中)。例如,fgets()函數(shù)讀完一整行數(shù)據(jù),而另一方面,read()函數(shù)讀指定字節(jié)數(shù)。,2.4 小結(jié),本章介紹了linux系統(tǒng)的基本操作,其中包括如何登錄linux系統(tǒng)、shell的基本命令和作為shell接口實(shí)現(xiàn)形式的控制臺(tái)與終端。另外本章介紹了linux的文件與目錄,只有對(duì)linux的文件系統(tǒng)有較深的理解,才能更好的掌握后面章節(jié)中所介紹文件操作的部分。在本章的最后,簡單講解了linux系統(tǒng)輸入與輸出的概念,這是計(jì)算機(jī)

19、程序設(shè)計(jì)的重要基礎(chǔ)知識(shí),讀者在學(xué)習(xí)linux程序開發(fā)中還需要從多個(gè)側(cè)面了解輸入輸出技術(shù)的知識(shí)。,第3章 linux gcc/g+編譯器與調(diào)試器,編譯器是將易于編寫、閱讀和維護(hù)的高級(jí)計(jì)算機(jī)語言翻譯為計(jì)算機(jī)能解讀、運(yùn)行的低階機(jī)器語言的程序。調(diào)試器是用于查找源代碼中的錯(cuò)誤,測試源代碼和可執(zhí)行文件的工具。gnu項(xiàng)目提供了gcc編譯器、g+編譯器和gdb調(diào)試器,這些程序是在linux系統(tǒng)上使用c和c+語言進(jìn)行開發(fā)的重要工具。本章將介紹這些工具的安裝和使用方法。,3.1 gcc/g+編譯器,gcc是gnu項(xiàng)目中的一個(gè)子項(xiàng)目,最初為用于編譯c語言的編譯器。隨著gnu項(xiàng)目的發(fā)展,gcc已經(jīng)成為了能編譯c、c+

20、、ada、object c和java等語言的gnu編譯器家族,同時(shí)還可執(zhí)行跨硬件平臺(tái)的交叉編譯工作。g+則是專門用來編寫c和c+語言的編譯器。c和c+語言正在不斷發(fā)展,為了保持兼容程序語言的最新特性,開發(fā)者通常選擇gcc來編譯c語言編寫的源代碼,選擇g+來編譯c+源代碼。,3.1.1 gcc/g+編譯器安裝,安裝或更新gcc和g+可在gnu項(xiàng)目的官方網(wǎng)站()去下載相應(yīng)的安裝包,也可以使用yum軟件包管理器安裝。安裝gcc和g+的命令如下: yum install make / 安裝make程序 yum install gcc / 安裝gcc編譯器 yum install

21、gcc-c+ / 安裝g+編譯器 注意:如果安裝過程中提示需要選擇編譯器版本,可根據(jù)當(dāng)前硬件平臺(tái)選擇最新發(fā)布的版本。另外,如果提示需要安裝其他相關(guān)軟件包,請(qǐng)一并安裝。,3.1.2 gcc/g+編譯命令,gcc/g+編譯器沒有圖形界面,只能在終端上以命令方式運(yùn)行。編譯命令由命令名、選項(xiàng)和源文件名組成,格式如下所示: gcc -選項(xiàng) 1 -選項(xiàng) 2-選項(xiàng) n g+ -選項(xiàng) 1 -選項(xiàng) 2-選項(xiàng) n 命令名、選項(xiàng)和源文件名之間使用空格分隔,一行命令中可以有多個(gè)選項(xiàng),也可以只有一個(gè)選項(xiàng)。文件名可以包含文件的絕對(duì)路徑,也可以使用相對(duì)路徑。如果文件名中不包含路徑,那么源文件被視為存在于工作目錄中。如果命令

22、中不包含輸出的可執(zhí)行文件名稱,默認(rèn)情況下將在工作目錄中生成后綴為“.out”的可執(zhí)行文件。,3.1.3 gcc/g+編譯選項(xiàng),gcc擁有一百多個(gè)編譯選項(xiàng)。對(duì)于c語言和c+語言,g+與gcc的編譯選項(xiàng)基本相同。常用的gcc和g+編譯選項(xiàng)見表3.1所示:,3.1.4 gcc/g+編譯器執(zhí)行過程,gcc和g+編譯器執(zhí)行過程可總結(jié)為四步:預(yù)處理、編譯、匯編、連接。在預(yù)處理過程中,編譯器會(huì)對(duì)源代碼中的頭文件和預(yù)處理語句進(jìn)行分析,生成以“.i”為后綴的預(yù)處理文件。,3.2 程序和進(jìn)程,程序和進(jìn)程是操作系統(tǒng)中的重要概念,程序是可運(yùn)行的一組指令,程序以二進(jìn)制代碼的形式保存在存儲(chǔ)設(shè)備中。操作系統(tǒng)運(yùn)行程序后,該程

23、序在內(nèi)存中的映像就是進(jìn)程,進(jìn)程是活動(dòng)的程序。,3.2.1 程序,程序是指一組指示計(jì)算機(jī)或其他具有信息處理能力設(shè)備每一步動(dòng)作的指令。linux系統(tǒng)下的應(yīng)用程序主要由兩種特殊類型的文件代表,分別是可執(zhí)行文件和腳本程序。可執(zhí)行文件是能夠被計(jì)算機(jī)直接執(zhí)行的程序,相當(dāng)于windows系統(tǒng)中的exe文件。使用c和c+語言設(shè)計(jì)的程序編譯后即是可執(zhí)行文件。linux系統(tǒng)不要求可執(zhí)行文件使用特定的擴(kuò)展名,文件是否能被執(zhí)行由文件的系統(tǒng)屬性來決定。,3.2.2 進(jìn)程和pid,進(jìn)程是一個(gè)具有獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次可以并發(fā)執(zhí)行的運(yùn)行活動(dòng),是處于活動(dòng)狀態(tài)的程序。進(jìn)程作為構(gòu)成系統(tǒng)的基本元件,不僅是系統(tǒng)內(nèi)部獨(dú)立

24、運(yùn)行的實(shí)體,而且是獨(dú)立競爭資源的實(shí)體。 在linux系統(tǒng)中,用戶創(chuàng)建進(jìn)程時(shí)會(huì)先在系統(tǒng)的進(jìn)程表中為進(jìn)程創(chuàng)建獨(dú)一無二的編碼,即pid。pid是一個(gè)正整數(shù),取值范圍在2到32768之間。進(jìn)程創(chuàng)建時(shí)會(huì)順序挑選下一個(gè)未使用的編號(hào)數(shù)字作為自己的pid,如果他們已經(jīng)經(jīng)過一圈的循環(huán),新的編碼重新從2開始。數(shù)字1一般是為特殊進(jìn)程init保留的,它負(fù)責(zé)管理其他的進(jìn)程。 ,3.3 ansi c標(biāo)準(zhǔn),c語言誕生后的很長一段時(shí)期內(nèi),并沒有針對(duì)c語言制定嚴(yán)格的標(biāo)準(zhǔn)。不同編譯器可能使用不同的語法規(guī)則或數(shù)據(jù)結(jié)構(gòu),此狀況對(duì)程序的移植帶來很多麻煩。于是,美國國家標(biāo)準(zhǔn)協(xié)會(huì)(ansi)決定統(tǒng)一c語言的標(biāo)準(zhǔn),并于1989年頒布ansx

25、3.159-1989標(biāo)準(zhǔn)文檔,這一標(biāo)準(zhǔn)被稱為ansi c標(biāo)準(zhǔn)。ansi c標(biāo)準(zhǔn)在訂立時(shí)吸取了很多c+語言的內(nèi)容,同時(shí)促使c語言支持多國字符集,其中包括各種中文字符集。ansi c標(biāo)準(zhǔn)的推出使c語言保持著活力,成為最受開發(fā)者歡迎的開發(fā)語言。,3.3.1 函數(shù)原型,函數(shù)原型由函數(shù)的返回類型、函數(shù)名和參數(shù)三部分組成。例如第一行中ssize_t表示該函數(shù)返回值是ssize_t類型的數(shù)值。括號(hào)中是參數(shù)列表,多個(gè)參數(shù)用逗號(hào)分隔,代碼中最后一行g(shù)etpid()函數(shù)的參數(shù)是void,表示getpid函數(shù)沒有參數(shù)。源代碼編譯時(shí),因?yàn)榫幾g器已經(jīng)知道參數(shù)的類型,所以會(huì)將調(diào)用的參數(shù)進(jìn)行強(qiáng)制轉(zhuǎn)換。,3.3.2 類屬指針

26、,類屬指針是一種能夠同時(shí)支持所有數(shù)據(jù)類型的指針,函數(shù)原型中常用的“void *”類型即是類屬指針。ansi c標(biāo)準(zhǔn)常用類屬指針代替函數(shù)參數(shù)中的其它指針,使同一個(gè)函數(shù)能支持多種數(shù)據(jù)類型。相關(guān)內(nèi)容將來本書的程序?qū)嵗卸啻我姷健?3.3.3 原始系統(tǒng)數(shù)據(jù)類型,在函數(shù)原型中以“_t”結(jié)尾的類型被稱為原始系統(tǒng)數(shù)據(jù)類型。原始系統(tǒng)數(shù)據(jù)類型定義在頭文件“sys/types.h”中,以typedef操作符加以定義。原始系統(tǒng)數(shù)據(jù)類型是目標(biāo)系統(tǒng)數(shù)據(jù)結(jié)構(gòu)的接口,在不同的操作系統(tǒng)中,其字長會(huì)有變化。,3.4 編譯hello world,hello world程序作為程序員學(xué)習(xí)的第一個(gè)程序已成為有趣的慣例。本節(jié)將講述如何

27、使用linux系統(tǒng)中默認(rèn)的編譯器編輯該程序的源代碼,并使用gcc編譯器將該程序編譯為可執(zhí)行文件。,3.4.1 使用vi編寫源代碼,vi是linux系統(tǒng)中最常用的文本編輯器,幾乎所有l(wèi)inux發(fā)行版中都已包含vi程序。它工作在控制臺(tái)或終端中,通過shell調(diào)用,全部操作均由命令完成,對(duì)于初學(xué)者來說并不容易掌握。,3.4.2 程序的編譯與連接,程序經(jīng)過編譯器的編譯與連接后,即可生成可執(zhí)行文件。如果源代碼有語法錯(cuò)誤,則會(huì)在終端上顯示錯(cuò)誤信息。有些時(shí)候,編譯器會(huì)出現(xiàn)警告提示,但程序依然被編譯成功。這表明源代碼沒有嚴(yán)格按照標(biāo)準(zhǔn)編寫,可能會(huì)在運(yùn)行時(shí)出現(xiàn)意外的結(jié)果。繼續(xù)前面的操作不改變工作目錄,編譯并連接“

28、helloworld.c”程序,可在終端上輸入下列命令: gcc -o helloworld helloworld.c / 編譯并連接程序 /“-o helloworld”表示使用“helloworld”作為目標(biāo)文件名,3.4.3 使用終端運(yùn)行程序,linux系統(tǒng)上運(yùn)行程序,必須給出該程序完整的路徑。前面的“helloworld.c”文件建立在“/home/用戶名/helloworld”目錄中,編譯和連接后所生成的可執(zhí)行文件也在該目錄中。運(yùn)行程序則需輸入“/home/用戶名/helloworld/helloworld”。但當(dāng)前的工作目錄已經(jīng)是“/home/用戶名/helloworld”了,所以

29、可用“./”替代工作目錄的路徑。,3.5 gdb調(diào)試器,程序編寫后難免會(huì)出現(xiàn)各種錯(cuò)誤,當(dāng)程序完成編譯時(shí),隱藏的錯(cuò)誤可能會(huì)使程序無法正常運(yùn)行,或者不能實(shí)現(xiàn)預(yù)期的功能。簡單的程序或淺顯的錯(cuò)誤可依賴程序員的經(jīng)驗(yàn)判斷出故障點(diǎn),但現(xiàn)在的軟件規(guī)格越來越大,調(diào)試起來也就越來越困難。調(diào)試器是幫助程序員修改錯(cuò)誤的得力工具,常用的斷點(diǎn)、單步跟蹤等功能可快速找到故障點(diǎn)。,3.5.1 gdb調(diào)試器概述,linux程序員中最常用的調(diào)試工具是gdb,gdb調(diào)試器是gnu項(xiàng)目的子項(xiàng)目。該程序提供了所有常用調(diào)試功能,是linux系統(tǒng)中最為簡單快捷的調(diào)試工具。由于當(dāng)前圖形用戶界面(gui)普及,大量基于gui的調(diào)試器被開發(fā)和運(yùn)

30、行在linux上。他們大多是以gdb為核心配上gui:用戶通過gui發(fā)出命令,這些命令依次被傳送給gdb。其中一個(gè)是ddd,意為數(shù)據(jù)顯示調(diào)試器。在一些集成開發(fā)環(huán)境如eclipse中,也提供了調(diào)試功能,并且以gdb為核心。,3.5.2 gdb調(diào)試器安裝,通常在linux桌面版的軟件開發(fā)包集合中已包含gdb調(diào)試器,如果需要安裝或更新gdb調(diào)試器,可使用yum軟件包管理器完成,操作方法如下: yum install gdb / yum安裝gdb調(diào)試器,3.5.3 gdb常用調(diào)試命令,gdb調(diào)試器調(diào)試的對(duì)象是可執(zhí)行文件,使用gcc或g+編譯器編譯源代碼時(shí),必須加上選項(xiàng)“-g”才能使目標(biāo)可執(zhí)行文件包含可

31、被調(diào)試的信息。,3.5.4 在gdb下運(yùn)行程序,打開可執(zhí)行文件后,可根據(jù)需要在程序中加入斷點(diǎn)或觀察點(diǎn),并運(yùn)行程序,以“helloworld”程序?yàn)槔稍跒樽兞抠x值前加入斷點(diǎn),并運(yùn)行程序。繼續(xù)上一小節(jié)的操作,方法如下: (gdb) break 5 / 在源代碼第5行,即變量c賦值處加入斷點(diǎn) (gdb) run / 運(yùn)行程序,3.5.5 檢查數(shù)據(jù),在程序中加入斷點(diǎn)后,程序運(yùn)行時(shí)會(huì)在斷點(diǎn)處暫時(shí)停止,以便檢查程序中的數(shù)據(jù)。通過檢查數(shù)據(jù)可判斷出許多種錯(cuò)誤的所在。“helloworld”程序在第5行加入了斷點(diǎn),這時(shí)第5行的代碼并未執(zhí)行。檢查常量c的值可輸入下列命令: (gdb) print c / 顯示

32、變量c的值,3.6 小結(jié),本章介紹了linux系統(tǒng)下編譯c和c+語言的編譯器gcc和g+的基本概念及操作,他們與文本編輯器vi的結(jié)合,組成了最簡單的程序開發(fā)環(huán)境。另外,本章講解了程序和進(jìn)程的概念,程序是編程工作的結(jié)果,進(jìn)程是程序運(yùn)行時(shí)在系統(tǒng)上的映射。gcc和g+編譯器是遵循ansi c標(biāo)準(zhǔn)所設(shè)計(jì)的,所以本章也簡單介紹了ansi c的概念,當(dāng)深入學(xué)習(xí)c語言時(shí),對(duì)ansi c標(biāo)準(zhǔn)的了解會(huì)避免許多程序錯(cuò)誤的產(chǎn)生。本章的最后介紹了gdb調(diào)試器,讀者還需要在學(xué)習(xí)中不斷摸索該工具的操作方法。,第4章 linux 開發(fā)環(huán)境,在上一章介紹了linux系統(tǒng)上最基本的開發(fā)工具,通過這些基本開發(fā)工具,可構(gòu)成簡單的開

33、發(fā)環(huán)境。但在純命令模式下編輯源代碼和調(diào)試軟件并不方便,特別是開發(fā)大型復(fù)雜軟件。本章將介紹一些更為強(qiáng)大的開發(fā)工具,這些開發(fā)工具結(jié)合gcc、g+編譯器和gdb調(diào)試器,組成了非常友好的開發(fā)環(huán)境,可以與windows系統(tǒng)下的集成開發(fā)環(huán)境相媲美。,4.1 文本編輯工具,文本編輯工具是用來編寫源代碼的應(yīng)用程序。linux上比較流行的文本編輯工具有vi、gedit、vim和emacs,這幾個(gè)應(yīng)用程序在編輯源代碼時(shí)有各自的優(yōu)點(diǎn)。下面以vim和emacs為例講解文本編輯工具的用法。,4.1.1 vim使用方法,linux系統(tǒng)下大多數(shù)文本編輯工具都可以直接在編輯區(qū)輸入字符,并且能夠通過一些命令來完成一些控制功能。

34、vim編輯器繼承了這些特性,它既能工作在終端中,又能工作在x window中,基本操作與vi相似,此外還提供了一些更適合源代碼開發(fā)的特性。,4.1.2 emacs使用方法,為了方便大型系統(tǒng)的開發(fā),gnu項(xiàng)目又推出了emacs文本編輯器。該編輯器運(yùn)行在x window環(huán)境中,不但具備所有基本的文本操作功能,同時(shí)為開發(fā)項(xiàng)目提供一些必備的應(yīng)用環(huán)境。,4.2 集成開發(fā)環(huán)境,集成開發(fā)環(huán)境是將一些開發(fā)工具集合到同一個(gè)操作界面的工具軟件,它通常由項(xiàng)目管理器、文件管理器、文本編輯工具、語法糾正器、編譯工具、調(diào)試工具組成。在linux系統(tǒng)中開發(fā)c、c+語言程序,可選擇的集成開發(fā)環(huán)境有eclipse和kdevel

35、op,分別運(yùn)行在gnome桌面環(huán)境和kde桌面環(huán)境。linux系統(tǒng)下的集成開發(fā)環(huán)境通常自身不包含編譯器和調(diào)試器,而是直接利用gcc、gdb等工具進(jìn)行組合。工具組合正代表了linux系統(tǒng)上軟件設(shè)計(jì)的思想。,4.2.1 eclipse介紹,eclipse最初是由ibm公司開發(fā),2001年11月正式貢獻(xiàn)給開源社區(qū),現(xiàn)在由非營利軟件供應(yīng)商聯(lián)盟eclipse基金會(huì)管理。2003年,osgi服務(wù)平臺(tái)規(guī)范成為eclipse運(yùn)行時(shí)架構(gòu)。最初eclipse用于開發(fā)java語言程序,但加入cdt插件后就能進(jìn)行c和c+語言程序開發(fā),并具備如下特性: 顯示提綱,outline窗口模塊可顯示源代碼中的過程、變量、聲明以

36、及函數(shù)的位置。 源代碼輔助,可結(jié)合上下文提示需要輸入的源代碼,并檢查源代碼中的語法錯(cuò)誤。 源代碼模板,擴(kuò)展源代碼輔助功能中使用的源代碼標(biāo)準(zhǔn),加入自定義的源代碼段,可加快代碼編輯速度。 源代碼歷史記錄,在沒有使用cvs等版本控制工具的情況下,也可記錄源代碼的修改情況。,4.2.2 kdevelop介紹,kdevelop是一個(gè)支持多種程序設(shè)計(jì)語言的集成開發(fā)環(huán)境,它運(yùn)行在kde桌面環(huán)境,可支持c、c+語言程序發(fā)開。kdevelop很好的支持了qt圖形界面工具包,因此是開發(fā)kde桌面工具的理想環(huán)境。用于開發(fā)c、c+語言程序時(shí),它的主要特性如下: 源代碼高亮顯示,kdevelop的編譯功能和調(diào)試功能該編

37、輯器支持源代碼高亮顯示和自動(dòng)縮進(jìn)的功能.。 項(xiàng)目管理,項(xiàng)目管理器可以管理各種不同的項(xiàng)目類型,。 類瀏覽器,該功能可在進(jìn)行面向?qū)ο箝_發(fā)時(shí),快速了解對(duì)象的結(jié)構(gòu)。 gui設(shè)計(jì)器,可進(jìn)行可見即可得的方式編輯軟件的圖形界面。 并行版本控制,支持cvs、subversion、perforce和clearcase等常用版本控制工具。,4.3 使用eclipse開發(fā)c/c+語言程序,綜合比較而言,eclipse集成開發(fā)環(huán)境是linux系統(tǒng)中最簡便的開發(fā)工具,不僅適合與初學(xué)者使用,也被眾多l(xiāng)inux程序設(shè)計(jì)專家所選擇的。因此,本書推薦使用eclipse作為讀者首選的開發(fā)環(huán)境。,4.3.1 安裝與配置eclips

38、e,eclipse運(yùn)行需要jre支持,所以首先要確保系統(tǒng)中已安裝jre。eclipse首次運(yùn)行要求配置工作目錄workspace,這個(gè)目錄是默認(rèn)用來存放源代碼與相關(guān)項(xiàng)目文件的位置,當(dāng)前用戶必須有該目錄讀寫和執(zhí)行的權(quán)限。,4.3.2 eclipse界面,eclipse界面由數(shù)個(gè)視圖窗格組成。左邊為project explorer視圖,該視圖用于創(chuàng)建、選擇和刪除項(xiàng)目。正中間的窗格是編輯器區(qū)域,該區(qū)域用于編輯源代碼,可同時(shí)打開多個(gè)文件。編輯器區(qū)域右側(cè)的outline視圖在編輯器中顯示文檔的大綱,這個(gè)大綱的內(nèi)容取決于源文件的類型。對(duì)于c和c+源代碼文件,該大綱將顯示所有被包含的函數(shù)庫、函數(shù)、常量、變量

39、、已聲明的類、屬性和方法等信息。,4.3.3 編譯與運(yùn)行源代碼,編譯與運(yùn)行源代碼前,首先需要保證gcc、g+編譯器和gdb調(diào)試器已安裝。eclipse通過調(diào)用gcc、g+編譯器實(shí)現(xiàn)源代碼編譯,因此必須要將源代碼的相關(guān)信息建立為項(xiàng)目文件,這樣才能使eclipse知道該使用哪一個(gè)編譯指令。,4.3.4 debug源代碼,eclipse的debug功能是調(diào)用gdb調(diào)試器實(shí)現(xiàn)的,與gdb的命令行不同,eclipse提供了更友好的圖形界面查看調(diào)試信息。要在代碼中加入斷點(diǎn),可直接在文本編輯區(qū)右擊左側(cè)區(qū)域彈出的菜單中操作。然后單擊run|debug命令菜單,進(jìn)入debug界面。,4.4 小結(jié),本章介紹了一些

40、高級(jí)的文本編輯器和集成開發(fā)環(huán)境,這些集成開發(fā)環(huán)境也是當(dāng)今大多數(shù)程序員所使用的工具。有一些大型軟件項(xiàng)目需要多位開發(fā)者協(xié)調(diào)工作,這時(shí)集成開發(fā)環(huán)境中的版本控制工具顯得非常重要。它用于保障多位開發(fā)者同時(shí)編譯一個(gè)文件的過程中,不會(huì)相互覆蓋對(duì)方的工作成果。另外,如果前面進(jìn)行的工作不小心在后面被刪除,版本控制工具也能方便的回溯到某個(gè)時(shí)間點(diǎn)。讀者在學(xué)習(xí)后面的章節(jié)時(shí),可使用集成開發(fā)環(huán)境編輯和運(yùn)行程序,在實(shí)際操作中積累經(jīng)驗(yàn)。,第5章 c語言編程基礎(chǔ),c語言是linux系統(tǒng)中最常用的程序設(shè)計(jì)語言。linux系統(tǒng)中的大多數(shù)軟件提供了c語言接口和源代碼,供用戶擴(kuò)展和改進(jìn)軟件的功能,或基于這些軟件構(gòu)成新軟件。正因?yàn)槿绱耍?/p>

41、在開源軟件開發(fā)過程中可以很容易學(xué)習(xí)到他人的開發(fā)經(jīng)驗(yàn)。gnu項(xiàng)目為c語言開發(fā)提供了豐富的工具,充分利用現(xiàn)有的代碼資源和這些開發(fā)工具可將學(xué)習(xí)到的知識(shí)付諸實(shí)踐,從而更快速地掌握c語言開發(fā)技術(shù)。,5.1 程序設(shè)計(jì)語言的發(fā)展,程序設(shè)計(jì)語言是用來描寫計(jì)算機(jī)程序的邏輯語法結(jié)構(gòu)。它已成為一種學(xué)科,同時(shí)也是程序設(shè)計(jì)者之間的交流方式。過去,程序設(shè)計(jì)語言是針對(duì)特定的計(jì)算機(jī)設(shè)計(jì),程序員針對(duì)計(jì)算機(jī)的不同結(jié)構(gòu)設(shè)計(jì)特定算法或者數(shù)據(jù)結(jié)構(gòu)。隨著計(jì)算機(jī)技術(shù)的發(fā)展,很多程序設(shè)計(jì)語言已能夠運(yùn)行在多種計(jì)算機(jī)平臺(tái)上,并能在不同平臺(tái)之間移植。正是因?yàn)槿绱?,程序員才會(huì)試圖使程序代碼更容易閱讀。在過去的幾十年間,大量的編程語言被發(fā)明、被取代、

42、被修改或組合在一起。,5.1.1 機(jī)器語言,電子計(jì)算機(jī)由復(fù)雜的邏輯電路所組成,它能夠“認(rèn)識(shí)”的僅僅是“0”和“1”所代表二進(jìn)制數(shù)字信號(hào)。最初的計(jì)算機(jī)語言,也就是以二進(jìn)制數(shù)字所組成的邏輯序列,稱為機(jī)器語言。每個(gè)二進(jìn)制字符稱為位(bit),計(jì)算機(jī)最小的存儲(chǔ)單元是8個(gè)位所組成的比特(byte)。機(jī)器語言難于閱讀,并只能針對(duì)特定的計(jì)算機(jī)編寫,代碼無法移植。,5.1.2 匯編語言,為了減輕程序設(shè)計(jì)的勞動(dòng)強(qiáng)度,計(jì)算機(jī)科學(xué)家設(shè)計(jì)了一些簡潔的英文縮寫來替代用于控制或表明數(shù)據(jù)類型的二進(jìn)制邏輯序列。例如,“add”表示兩個(gè)變量相加,“in”表示讀取端口數(shù)據(jù),于是誕生了匯編語言。,5.1.3 高級(jí)語言,高級(jí)語言的發(fā)

43、展也經(jīng)歷了從早期語言到結(jié)構(gòu)化程序設(shè)計(jì)語言,從面向過程到面向?qū)ο蟮霓D(zhuǎn)變。相應(yīng)的,軟件的開發(fā)也由最初的個(gè)體手工作坊式封閉生產(chǎn),發(fā)展為產(chǎn)業(yè)化、流水線式工業(yè)化生產(chǎn)。隨著程序設(shè)計(jì)語言的進(jìn)步,程序設(shè)計(jì)方法隨之也愈加豐富。 高級(jí)語言的下一個(gè)發(fā)展目標(biāo)是面向應(yīng)用,也就是說:只需要告訴程序你要干什么,程序就能自動(dòng)生成算法,自動(dòng)進(jìn)行處理,這就是非過程化的程序語言。,5.2 c語言的特點(diǎn),c語言,是一種通用的、程序式的編程語言,廣泛用于系統(tǒng)與應(yīng)用軟件的開發(fā)。具有高效、靈活、功能豐富、表達(dá)力強(qiáng)和較高的移植性等特點(diǎn),在程序員中備受青睞。c語言是由unix的研制者丹尼斯里奇(dennis ritchie)和肯湯普遜(ken

44、 thompson)在1970年研制出的b語言的基礎(chǔ)上發(fā)展和完善起來的。,5.2.1 c語言是中級(jí)語言,c語言通常稱為中級(jí)語言,這是因?yàn)樗兄c匯編語言類似,能直接訪問計(jì)算機(jī)底層資源的能力,同時(shí)它又具備了高級(jí)語言的各種優(yōu)點(diǎn)。作為中級(jí)語言,c允許對(duì)位、字節(jié)和地址這些計(jì)算機(jī)功能中的基本成分進(jìn)行操作。c語言程序非常容易移植,甚至可以設(shè)計(jì)出能同時(shí)運(yùn)行在linux系統(tǒng)和unix、windows等操作系統(tǒng)上的軟件。,5.2.2 c語言是結(jié)構(gòu)化語言,結(jié)構(gòu)化語言所使用的設(shè)計(jì)方法為模塊化設(shè)計(jì)方法,每個(gè)子問題求解的步驟被定義為模塊。在c語言中,函數(shù)就是模塊化的體現(xiàn)。函數(shù)之間是相互獨(dú)立的,函數(shù)內(nèi)的數(shù)據(jù)只能通過接口進(jìn)

45、行傳遞。c語言程序中,數(shù)據(jù)與代碼是分離的,數(shù)據(jù)在各個(gè)函數(shù)之間通過接口傳遞。因此,設(shè)計(jì)良好的函數(shù)能夠在多個(gè)程序間反復(fù)使用,構(gòu)成了代碼復(fù)用的基礎(chǔ)。,5.2.3 c語言是程序員的語言,程序設(shè)計(jì)語言中,有許多是針對(duì)非程序員所設(shè)計(jì)的語言,大多數(shù)解釋性語言都是非程序員的語言,例如basic、foxpro。這一類語言雖然容易學(xué)習(xí),但是所生產(chǎn)的程序執(zhí)行效率低、可靠性差,不能訪問計(jì)算機(jī)底層的資源。與其形成鮮明對(duì)比的是c語言,由于程序生成、修改和現(xiàn)場測試自始至終均由真正的程序員進(jìn)行,因而它實(shí)現(xiàn)了程序員的期望:很少限制,語法自由,具備塊結(jié)構(gòu)和獨(dú)立的函數(shù),以及緊湊的關(guān)鍵字集合。用c語言編程,程序員可以獲得高效機(jī)器代碼

46、,其效率幾乎接近匯編語言代碼。,5.3 c語言的程序結(jié)構(gòu),任何一種程序設(shè)計(jì)語言都具有特定的語法規(guī)則和規(guī)定的表達(dá)方法。一個(gè)程序只有嚴(yán)格按照語言規(guī)定的語法和表達(dá)方式編寫,才能保證編寫的程序在計(jì)算機(jī)中能正確地執(zhí)行,同時(shí)也便于閱讀和理解。,5.3.1 基本程序結(jié)構(gòu),基本程序結(jié)構(gòu)就是從上至下順序執(zhí)行的程序,c語言程序必須有且只有一個(gè)主函數(shù),程序從主函數(shù)開始執(zhí)行,直到主函數(shù)結(jié)束。 c語言程序?yàn)楹瘮?shù)模塊結(jié)構(gòu),所有的c語言程序都是由一個(gè)或多個(gè)函數(shù)構(gòu)成。c語言程序的函數(shù)可分為編譯器提供的標(biāo)準(zhǔn)函數(shù)和由用戶自己定義的函數(shù)。,5.3.2 函數(shù)庫和鏈接,函數(shù)的集合稱之為函數(shù)庫,遵守ansi c標(biāo)準(zhǔn)的編譯器所提供函數(shù)組成

47、的函數(shù)庫稱之為ansi c標(biāo)準(zhǔn)函數(shù)庫。編寫程序時(shí)用到的函數(shù)許多都可以在標(biāo)準(zhǔn)函數(shù)庫中找到,他們是可以簡單地組合起來的程序構(gòu)件。編寫了一個(gè)經(jīng)常要用的函數(shù)之后,也可將其放入自定義的庫中備用。 編譯器編譯源代碼時(shí)以函數(shù)為單位進(jìn)行編譯,并記憶函數(shù)的名字。隨后,編譯器以源文件中的順序去查找函數(shù)間的關(guān)系,并且在可執(zhí)行文件內(nèi)部實(shí)現(xiàn)函數(shù)間的可訪問性,該過程稱之為“鏈接”。,5.3.3 開發(fā)一個(gè)c語言程序,程序開發(fā)是一個(gè)科學(xué)的過程,開發(fā)一個(gè)c語言程序通??筛爬橐韵滤膫€(gè)步驟: 1程序設(shè)計(jì) 2編寫源代碼 3程序測試 4程序運(yùn)行,5.3.4 c語言的關(guān)鍵字,關(guān)鍵字是已被c語言標(biāo)準(zhǔn)作為命令、數(shù)據(jù)類型或者固定函數(shù)名的字母

48、組合。關(guān)鍵字不能被用做變量名或函數(shù)名。表5.1列舉了c語言的32個(gè)關(guān)鍵字,他們遵循c語言的語法使用,形成了c程序設(shè)計(jì)語言。,5.4 算法,關(guān)于計(jì)算機(jī)程序的定義,有一種經(jīng)典的表述是程序等于數(shù)據(jù)結(jié)構(gòu)加上算法。這句話可以解釋為,數(shù)據(jù)結(jié)構(gòu)是將事物抽象成為可運(yùn)算的數(shù)據(jù)形式輸入到計(jì)算機(jī)中,而算法是對(duì)這些數(shù)據(jù)計(jì)算的方法。例如求某個(gè)學(xué)生的平均分,那么數(shù)據(jù)結(jié)構(gòu)由課程名稱和分值組成,求平均分的算法是將分值的總和除以課程總數(shù)。對(duì)于一些特殊的問題,例如排序、解方程、編碼等,出現(xiàn)了許多適合計(jì)算機(jī)運(yùn)算的算法,這些算法甚至專門針對(duì)于某個(gè)程序設(shè)計(jì)語言。由此可見,程序設(shè)計(jì)的關(guān)鍵之一,是解題的方法與步驟,是算法。,5.4.1 流

49、程圖與算法的結(jié)構(gòu)化描述,流程圖可用來描述事務(wù)的處理過程,因此是最早引入計(jì)算機(jī)算法設(shè)計(jì)領(lǐng)域的圖示方法?;玖鞒虉D的形狀如圖5.1所示。 1順序結(jié)構(gòu) 2選擇結(jié)構(gòu) 3循環(huán)結(jié)構(gòu),5.4.2 用n-s圖描述算法,除了傳統(tǒng)的流程圖以外,還有很多種圖形可以用來描述程序的結(jié)構(gòu)。n-s圖就是其中的一種,它由矩形組成,一個(gè)程序模塊是最外圍的矩形外框,程序中的每個(gè)步驟都是一個(gè)內(nèi)嵌的小矩形,如圖5.6所示。,5.4.3 用pad圖描述算法,pad圖(problem analysis diagram)是國際上專業(yè)的程序員廣泛使用的一種程序流程表示法。與其他圖形相比,pad圖更容易描述扁平化的程序結(jié)構(gòu)。特別是一些應(yīng)用管理

50、類軟件,其中都會(huì)有很多扁平化的分支語句,這些語句用pad描述更為清晰。,5.5 軟件工程概覽,軟件工程是計(jì)算機(jī)科學(xué)的一個(gè)重要分支,所涉及的范圍非常廣泛。包括軟件開發(fā)技術(shù)、軟件工程環(huán)境、工程經(jīng)濟(jì)學(xué)和工程管理等許多知識(shí)領(lǐng)域。本節(jié)主要介紹軟件工程的基本任務(wù)和常用的軟件項(xiàng)目開發(fā)模型,以及如何通過軟件工程指導(dǎo)c語言編程。其中,樸素軟件工程思想是一套在教學(xué)中總結(jié)出的軟件開發(fā)規(guī)律,它的主要目的是指導(dǎo)編程語言課程設(shè)計(jì),也可用于少數(shù)開發(fā)者參與的軟件項(xiàng)目。,5.5.1 認(rèn)識(shí)軟件工程,軟件工程存在于各種應(yīng)用中,存在于軟件開發(fā)的各個(gè)方面。而程序設(shè)計(jì)只包含了程序設(shè)計(jì)和編碼的反復(fù)迭代的過程,它是軟件開發(fā)的一個(gè)階段。軟件工

51、程力圖對(duì)軟件項(xiàng)目的各個(gè)方面做出指導(dǎo),從軟件的可行性分析直到軟件完成以后的維護(hù)工作。 1用分階段的生命周期計(jì)劃嚴(yán)格管理 2堅(jiān)持進(jìn)行階段評(píng)審 3實(shí)行嚴(yán)格的產(chǎn)品控制 4采用現(xiàn)代程序設(shè)計(jì)技術(shù) 5結(jié)果應(yīng)能清楚地審查 6開發(fā)人員應(yīng)少而精 7實(shí)踐中不斷改進(jìn)軟件工程,5.5.2 瀑布模型及其改進(jìn),瀑布模型是由溫斯頓羅伊斯(winston royce)在1970年最初提出的軟件開發(fā)模型。瀑布模型將軟件開發(fā)過程定義為6個(gè)步驟,分別是問題定義、需求分析、設(shè)計(jì)原型、實(shí)現(xiàn)與單元測試、集成與系統(tǒng)維護(hù)、發(fā)布、運(yùn)行與維護(hù)。,5.5.3 迭代發(fā)布模型,迭代發(fā)布模型是一種與傳統(tǒng)軟件工程開發(fā)相反的軟件開發(fā)過程,它彌補(bǔ)了傳統(tǒng)開發(fā)方式

52、中的一些缺點(diǎn),具有更高的成功率和生產(chǎn)率。,5.5.4 樸素軟件工程思想,樸素軟件工程思想將迭代發(fā)布模型簡化為四個(gè)步驟,然后反復(fù)循環(huán)這四個(gè)步驟直到軟件生命周期結(jié)束。這四個(gè)步驟分別是: 1確定項(xiàng)目視圖與范圍 2軟件設(shè)計(jì) 3編碼 4發(fā)布,5.6 小結(jié),本章介紹了c語言基礎(chǔ)知識(shí)和程序設(shè)計(jì)知識(shí),將多變的程序結(jié)構(gòu)總結(jié)成三種基本結(jié)構(gòu),同時(shí)引入流程圖的概念,流程圖能將任何復(fù)雜的程序抽象為程序員間通用的符號(hào)語言。另外,本章介紹了算法的概念和軟件工程知識(shí),將程序設(shè)計(jì)和軟件開發(fā)作為一門工程學(xué)對(duì)待。這些內(nèi)容與實(shí)際的軟件開發(fā)工作完全一致,需要讀者深入的理解與掌握。,第6章 數(shù)據(jù)類型、運(yùn)算符和表達(dá)式,數(shù)據(jù)類型、運(yùn)算符和表

53、達(dá)式是c語言的三個(gè)基本組成部分。數(shù)據(jù)類型決定了如何將數(shù)據(jù)存儲(chǔ)到計(jì)算機(jī)的內(nèi)存中,運(yùn)算符是數(shù)據(jù)之間執(zhí)行何種運(yùn)算的代號(hào),而表達(dá)式則是c語言最基本的語法。本章將通過學(xué)習(xí)c語言的三個(gè)基本組成部分來掌握基本的c語言程序設(shè)計(jì)。,6.1 c語言的數(shù)據(jù)類型,c語言有五種基本的數(shù)據(jù)類型,分別是字符型、整型、單精度浮點(diǎn)型、雙精度浮點(diǎn)型和空類型。在不同的操作系統(tǒng)或硬件平臺(tái)中,這些數(shù)據(jù)類型的值域范圍和所占用的內(nèi)存的數(shù)量。這種差異影響了c語言的可移植性能,但如果能深入理解數(shù)據(jù)類型的構(gòu)成,則可以最大程度避免該問題。,6.1.1 基本類型的字長與范圍,字長是指數(shù)據(jù)所占用內(nèi)存的數(shù)量,字長決定了數(shù)據(jù)類型的值域,即范圍。以字符型為

54、例,ansi c標(biāo)準(zhǔn)中的字符型的長度是1字節(jié)(8位二進(jìn)制編碼),可計(jì)算其值域?yàn)?7,取值范圍為-128127。計(jì)算機(jī)所使用的ascii字符編碼共有128個(gè)元素,所以用字符型可將全部元素表示出來。,6.1.2 聚合類型與修飾符,聚合類型構(gòu)成了復(fù)雜的數(shù)據(jù)結(jié)構(gòu),用以描述事物的各種屬性。除void類型外,基本類型的前面可以有各種修飾符。修飾符用來改變基本類型的意義,以便更準(zhǔn)確地適應(yīng)各種情況的需求。 修飾符signed、short、long和unsigned適用于字符和整數(shù)兩種基本類型。,6.2 常量與變量,顧名思義,常量是運(yùn)算中不能改變數(shù)值的數(shù)據(jù)類型,變量是可改變數(shù)值的數(shù)據(jù)類型。根據(jù)需要,可將一些在程

55、序運(yùn)行中不必改變數(shù)值的類型定義為常量,這樣也可避免因修改數(shù)值造成程序錯(cuò)誤。任何改變常量數(shù)值的操作都會(huì)引起編譯錯(cuò)誤。,6.2.1 標(biāo)識(shí)符命名,標(biāo)識(shí)符是數(shù)據(jù)或程序模塊的名字,一般情況下,只能通過標(biāo)識(shí)符操作對(duì)應(yīng)的數(shù)據(jù)或模塊。ansi c規(guī)定了標(biāo)識(shí)符的命名規(guī)則,第一個(gè)字符必須為下劃線或英文字母,其后的字符必須為下劃線、數(shù)字或英文字母。例如,“year”、“month01”、“_day”都是正確的命名,而“2year”、“mon!th01”、“day.one”是錯(cuò)誤的命名。另外,標(biāo)識(shí)符命名時(shí)要避免與c語言關(guān)鍵字相同。,6.2.2 常量,c語言中的常量有四種基本類型:“#define”定義的符號(hào)常量,字符

56、、字符串常量和數(shù)值常量,常量變量,枚舉常量。 符號(hào)常量通常出現(xiàn)在文件的開始,它更像是編輯器的字符串替換操作。 字符、字符串常量和數(shù)值常量是直接在源代碼中出現(xiàn)的字符、字符串和字符,因?yàn)槌绦蜻\(yùn)行時(shí)他們會(huì)在內(nèi)存中占據(jù)固定內(nèi)存,所以我們認(rèn)為它是常量。 常量變量是一種特殊的常量,它實(shí)際是用“const”修飾符限制了變量改變其值。 枚舉常量是一種聚合類型,它有多個(gè)成員,默認(rèn)情況下第一個(gè)成員所代表的數(shù)值是0,后面的成員所代表的數(shù)值在前面成員的數(shù)值上加1。,6.2.3 變量,運(yùn)算中可以改變數(shù)值的數(shù)據(jù)類型稱為變量。每個(gè)變量擁有惟一的名字,在內(nèi)存中占據(jù)一定的存儲(chǔ)單元,在該存儲(chǔ)單元中存放變量的值。 聲明變量和為變量

57、賦值也可從兩個(gè)語句合并為一個(gè)語句。 變量在被使用前必須先賦值,未賦值前,其值可能會(huì)是對(duì)應(yīng)數(shù)據(jù)類型中的任意一個(gè)數(shù)字。如果變量被聲明,但在整個(gè)程序中都未對(duì)其賦值或使用,則gcc編譯器會(huì)給出一個(gè)警告信息。,6.3 整型數(shù)據(jù),沒有小數(shù)位或指數(shù)的數(shù)據(jù)類型被稱為整型數(shù)據(jù),根據(jù)使用方法的分類,整型數(shù)據(jù)可分為整型常量和整型變量。根據(jù)定義或顯示的數(shù)制分類,可分為十進(jìn)制、八進(jìn)制和十六進(jìn)制。,6.3.1 整型常量,整型常量是在運(yùn)算中不可改變的整型數(shù)據(jù)類型,可使用十進(jìn)制、八進(jìn)制和十六進(jìn)制描述一個(gè)整型常量。 其中十進(jìn)制整數(shù)值可以是從0到9的一個(gè)或多個(gè)十進(jìn)制數(shù)位,第1位可以是正負(fù)符號(hào),但不能是0。 八進(jìn)制和十六進(jìn)制整型常

58、量在存儲(chǔ)方式上與十進(jìn)制數(shù)并無區(qū)別,只是定義時(shí)使用了不同的表述方法。八進(jìn)制和十六進(jìn)制整型常量的存儲(chǔ)空間長度也有數(shù)值來決定,并且可以存在負(fù)值。,6.3.2 整型變量,為變量命名的過程稱為“聲明”,c語言規(guī)定,變量使用前必須聲明。整型變量用int修飾符聲明,如下列源代碼所示: main() int a, c; / 聲明整型變量 unsingned int b; / 聲明無符號(hào)整型變量 a = 15; / 為變量a賦值 b = a; / 為變量b賦值,b的值來至a c = a + b; / 為變量c賦值,c的值來至a與b的和 printf(c = %dn, c); / 輸出提示字符串和c的值 ,6.4

59、 浮點(diǎn)型數(shù)據(jù),浮點(diǎn)型數(shù)據(jù)又稱實(shí)型數(shù)據(jù),是一個(gè)以十進(jìn)制表示的符號(hào)實(shí)數(shù)。符號(hào)實(shí)數(shù)的值包括整數(shù)部分、尾數(shù)部分和指數(shù)部分。,6.4.1 浮點(diǎn)型常量,一些較大的數(shù)值,或者有小數(shù)位、指數(shù)位的數(shù)值都需要用浮點(diǎn)型常量表示。浮點(diǎn)型常量的形式是: 正負(fù)符號(hào) 數(shù)值 .數(shù)值 e | e 正負(fù)符號(hào) 數(shù)值 其中,“數(shù)值”是一位或多位十進(jìn)制數(shù)字,“e”或“e”是指數(shù)符號(hào)。小數(shù)點(diǎn)之前是整數(shù)部分,小數(shù)點(diǎn)之后是尾數(shù)部分,如果小數(shù)點(diǎn)后沒有數(shù)值,尾數(shù)部分可以省略。指數(shù)符號(hào)后的正負(fù)符號(hào)修飾指數(shù),如果是正數(shù),可省略正負(fù)符號(hào)。如果沒有指數(shù),指數(shù)符號(hào)及其后的內(nèi)容都可省略。,6.4.2 浮點(diǎn)型變量,浮點(diǎn)型變量分為單精度(float型)和雙精度(double型)。對(duì)每一個(gè)浮點(diǎn)型變量都應(yīng)在使用前加以定義。 如果浮點(diǎn)型常量是雙精度浮點(diǎn)型,當(dāng)把該常量賦給一個(gè)單精度浮點(diǎn)型變量時(shí),系統(tǒng)會(huì)截取相應(yīng)的有效位數(shù)。 由于float型變量只能接收7位有效數(shù)字,因此最后兩位小數(shù)不起作用。如果將a改為double型,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論