LINUX高級(jí)用戶教程省名師獲獎(jiǎng)?wù)n件市賽課一等獎(jiǎng)?wù)n件_第1頁(yè)
LINUX高級(jí)用戶教程省名師獲獎(jiǎng)?wù)n件市賽課一等獎(jiǎng)?wù)n件_第2頁(yè)
LINUX高級(jí)用戶教程省名師獲獎(jiǎng)?wù)n件市賽課一等獎(jiǎng)?wù)n件_第3頁(yè)
LINUX高級(jí)用戶教程省名師獲獎(jiǎng)?wù)n件市賽課一等獎(jiǎng)?wù)n件_第4頁(yè)
LINUX高級(jí)用戶教程省名師獲獎(jiǎng)?wù)n件市賽課一等獎(jiǎng)?wù)n件_第5頁(yè)
已閱讀5頁(yè),還剩98頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

LINUX高級(jí)用戶教程3月第1頁(yè)LINUX高級(jí)用戶教程主要章節(jié)LINUX概況LINUX開發(fā)環(huán)境LINUX進(jìn)程環(huán)境和空間管理LINUX進(jìn)程管理LINUX下信號(hào)LINUX下計(jì)時(shí)第2頁(yè)LINUX用戶教程主要章節(jié)文件操作網(wǎng)絡(luò)編程LINUX進(jìn)程間通信系統(tǒng)配置和管理第3頁(yè)LINUX概述LINUX歷史、現(xiàn)實(shí)狀況和未來(lái)LINUX主要特點(diǎn)LINUX遵照一些標(biāo)準(zhǔn)怎樣取得LINUX在線幫助LINUX經(jīng)常問(wèn)到一些問(wèn)題

第4頁(yè)LINUX開發(fā)環(huán)境LINUX下C編譯器GNUMake程序中庫(kù)函數(shù)和頭文件編程格調(diào)LINUX下目標(biāo)代碼格式和相關(guān)命令第5頁(yè)LINUX進(jìn)程環(huán)境和空間管理LINUX進(jìn)程環(huán)境用戶環(huán)境變量用戶程序空間布局用戶動(dòng)態(tài)空間分配空間分配相關(guān)接口

第6頁(yè)LINUX進(jìn)程管理Fork()ExecWaitExit第7頁(yè)LINUX下信號(hào)信號(hào)起源和種類進(jìn)程對(duì)信號(hào)響應(yīng)LINUX下信號(hào)定義信號(hào)發(fā)送信號(hào)安裝信號(hào)集合和集合操作信號(hào)編程注意事項(xiàng)實(shí)例第8頁(yè)LINUX計(jì)時(shí)LINUX中時(shí)間Shell計(jì)時(shí)方法

第9頁(yè)文件操作文件類型文件屬性和操作目錄操作符號(hào)鏈接和IO操作系統(tǒng)調(diào)用接口文件流操作IO相關(guān)庫(kù)接口

第10頁(yè)網(wǎng)絡(luò)編程套接口網(wǎng)絡(luò)分層協(xié)議網(wǎng)絡(luò)通信模型LINUX下慣用網(wǎng)絡(luò)通信接口網(wǎng)絡(luò)通信實(shí)例

第11頁(yè)進(jìn)程間通信進(jìn)程通信類型基于管道通信和FIFO通信消息隊(duì)列信號(hào)量共享內(nèi)存

第12頁(yè)系統(tǒng)管理(一)系統(tǒng)安裝GRUB開啟引導(dǎo)器,開啟過(guò)程和系統(tǒng)服務(wù)開啟狀態(tài)和服務(wù)配置用戶和組管理進(jìn)程管理軟件包管理第13頁(yè)系統(tǒng)管理(二)網(wǎng)絡(luò)配置文件系統(tǒng)設(shè)置LINUX下各種設(shè)置使用遠(yuǎn)程登陸FTP、NFS配置Samba安全設(shè)置

第14頁(yè)第一章LINUX概況第15頁(yè)為何選擇LINUX

——軟件模式 當(dāng)今軟件按照其提供方式和是否贏利能夠劃分為三種模式,即:商業(yè)模式(commercialsoftware)、共享模式

(shareware)和自由軟件(freeware或freesoftware)。商業(yè)軟件由開發(fā)者出售拷貝并提供軟件技術(shù)服務(wù),用戶只有使用權(quán),但不能進(jìn)行非法拷貝、擴(kuò)散和修改;共享軟件由開發(fā)者提供軟件試用程序拷貝授權(quán),用戶在使用該程序拷貝一段時(shí)間之后,必須向開發(fā)者繳納使用費(fèi),開發(fā)者則提供對(duì)應(yīng)升級(jí)和技術(shù)服務(wù);自由軟件則由開發(fā)者提供軟件全部源代碼,任何用戶都有權(quán)使用、拷貝、擴(kuò)散和修改這些軟件,同時(shí)有義務(wù)將自己修改過(guò)程序代碼公開。

第16頁(yè)自由軟件兩層含義

能夠無(wú)償提供給任何用戶使用;它源碼公開和能夠自由修改。所謂能夠自由修改指用戶能夠?qū)_源碼進(jìn)行修改,以使自由軟件愈加完善,還能夠?qū)ψ杂绍浖M(jìn)行修改基礎(chǔ)上開發(fā)上層軟件。

第17頁(yè)自由軟件誕生UNIX從二十世紀(jì)七十年代誕生發(fā)展到八十年代,已經(jīng)形成了多個(gè)分支(插圖),

Unix在商業(yè)上面問(wèn)題讓許多對(duì)于Unix喜好者感到相當(dāng)憂心,其中一個(gè)就是有名RichardM.Stallman先生,他認(rèn)為:Unix是一個(gè)相當(dāng)好操作系統(tǒng),在這個(gè)系統(tǒng)上,大家能夠?qū)⒆约核鶎W(xué)貢獻(xiàn)出來(lái),那么這個(gè)系統(tǒng)將會(huì)愈加優(yōu)異。讓自己發(fā)展良好軟件讓大家來(lái)使用就是最大高興,而且因?yàn)槊總€(gè)人工作環(huán)境(指軟硬件平臺(tái))可能都不太相同,有了OpenSource概念,大家都能夠分享這一份心得!你程序?qū)⒂泻芏嗳四軌驇兔z驗(yàn),將使得Unix社群更佳茁壯。于是為了理想,Stallman在1984年創(chuàng)建了GNU(GNU是“GNU'sNotUNIX”縮寫)與

自由軟件基金會(huì)(FreeSoftwareFoundation,FSF),并創(chuàng)作了許多『自由軟件』供大眾來(lái)使用。其作品以自由(free)GNUGPL授權(quán)模式提供。第18頁(yè)自由軟件帶來(lái)好處free軟件給使用者節(jié)約了相當(dāng)一筆費(fèi)用;Internet普及,使人們很輕易下載開放源代碼軟件,很輕易把開發(fā)、改進(jìn)新結(jié)果上網(wǎng)交流。使軟件開發(fā)由過(guò)去集中在專門機(jī)構(gòu)里進(jìn)行變?yōu)榉稚⒃诰W(wǎng)絡(luò)上由許許多多獨(dú)立開發(fā)者協(xié)作完成。它能夠調(diào)動(dòng)更多人主動(dòng)性,發(fā)揮更多人創(chuàng)造性,而且受到更多人實(shí)踐檢驗(yàn),因而能夠更加快地完成和完善。這種方法不但比傳統(tǒng)方式開發(fā)軟件更為穩(wěn)固,而且能夠取得更多支持和更加快更新。LINUX一句名言:“BUG就像影子一樣,只會(huì)出現(xiàn)在陽(yáng)光照不到角落中”

第19頁(yè)什么是LINUXLINUX是一個(gè)操作系統(tǒng),同時(shí)它是一個(gè)自由軟件,是free、源代碼開放,設(shè)計(jì)它目標(biāo)是建立不受任何商品化軟件版權(quán)制約、全世界都能自由使用UNIX兼容操作系統(tǒng)產(chǎn)品。經(jīng)典Linux發(fā)行版包含Linux內(nèi)核,但還包含許多應(yīng)用程序和工具??傉f(shuō)來(lái),Linux發(fā)行版中出現(xiàn)許多系統(tǒng)級(jí)和用戶級(jí)工具都來(lái)自自由軟件基金會(huì)(FreeSoftwareFoundation)GNU項(xiàng)目。Linux內(nèi)核和GNU工具套件都在GNU通用公共許可證(GNUGeneralPublicLicense,GNUGPL)下發(fā)行。

第20頁(yè)為何使用LINUXLINUX是一套含有UNIX全部功效free操作系統(tǒng),用戶能夠無(wú)償?shù)玫剿霸创a并取得大量應(yīng)用,而且能夠任意修改和補(bǔ)充他們,對(duì)于用戶學(xué)習(xí)、了解UNIX操作系統(tǒng)內(nèi)核非常有益。LINUX是當(dāng)前唯一能夠無(wú)償取得、為PC機(jī)及其它平臺(tái)上多個(gè)用戶提供多任務(wù)、多進(jìn)程功效操作系統(tǒng),這是人們要使用它主要原因。LINUX讓我們從許可證限制中解脫出來(lái),而使用含有許可證商業(yè)軟件就意味著時(shí)時(shí)刻刻都得對(duì)許可證許多條例負(fù)責(zé)。Linux有非常廣泛平臺(tái)適應(yīng)性。它在基于Intel企業(yè)x86(也包含AMD、Cyrix、IDT)計(jì)算機(jī)、基于Alpha計(jì)算機(jī),以及蘋果、Sun、SGI等企業(yè)計(jì)算機(jī)上都有對(duì)應(yīng)公布版本,甚至在AS/400這么機(jī)器上都能找到對(duì)應(yīng)版本。Linux還能夠在許多PDA和掌上電腦以及嵌入式設(shè)備上運(yùn)行。

已經(jīng)有非常多應(yīng)用程序能夠在Linux上運(yùn)行,大多數(shù)為SCOUnix開發(fā)應(yīng)用程序都能在Linux上運(yùn)行(借助于iBCS軟件包),甚至還比在SCOUnix上運(yùn)行速度更加快。LINUX之所以大受歡迎,不但僅因?yàn)樗菬o(wú)償,更主要是linux含有極其豐富功效,LINUX操作系統(tǒng)不但能夠用于服務(wù)器,其桌面環(huán)境也相當(dāng)不錯(cuò)。第21頁(yè)LINUX歷史在80年代末,以intel主導(dǎo)x86系統(tǒng)架構(gòu)個(gè)人計(jì)算機(jī)大行其道!但在此時(shí),人們使用大多還是需要吃很多系統(tǒng)資源DOS系列或其它操作系統(tǒng)。芬蘭郝爾辛基大學(xué)(Helsinki)LinusTorvalds

學(xué)生做了件不尋常事情!Linus手邊有個(gè)Minix

系統(tǒng)

,他對(duì)這個(gè)操作系統(tǒng)有相當(dāng)興趣!開始了把Unix操作系統(tǒng)移植到個(gè)人計(jì)算機(jī)(X86架構(gòu))嘗試基于

Stallman

提倡OpenSource,經(jīng)過(guò)有心讀取Unix關(guān)鍵,而且去除較為繁復(fù)關(guān)鍵程序,將他改寫成能夠適合用于普通個(gè)人計(jì)算機(jī)x86系統(tǒng)上面,到了1991

年,他終于將

0.02

版hobby放到網(wǎng)絡(luò)上面供大家下載,而且因?yàn)閔obby受到大家必定,相當(dāng)多朋友一起投入這個(gè)工作中!終于到了

1994

年將第一個(gè)完整關(guān)鍵

Version1.0

公布!——LINUX一個(gè)主要里程碑第22頁(yè)LINUX歷史(續(xù))因?yàn)長(zhǎng)inuxkernel發(fā)展是由『虛擬團(tuán)體』所達(dá)成,大家都是透過(guò)網(wǎng)絡(luò)取得Linux關(guān)鍵原始碼,經(jīng)由自己精心改造后再回傳給Linux社群,進(jìn)而一步一步發(fā)展完成完整Linux系統(tǒng),至于Torvalds先生是這個(gè)集團(tuán)中發(fā)起者。因?yàn)檫@個(gè)群策群力緣故,Torvalds先生將Linux定為一樣造福大家GNU授權(quán)模式!企鵝起源:

1994年發(fā)表Linux正式關(guān)鍵1.0時(shí)候,大家要LinusTorvalds想一只吉祥物,怪怪Torvalds突然想到小時(shí)候去動(dòng)物園被一只企鵝追著滿地打滾~還被咬了一口!既然想不到其它吉祥物了,干脆就以這支企鵝來(lái)當(dāng)吉祥物算了!所以,當(dāng)前我們經(jīng)常看到這一只企鵝就是這么來(lái)!

第23頁(yè)LINUX發(fā)展現(xiàn)實(shí)狀況和趨勢(shì)

誕生了十多年LINUX應(yīng)用越來(lái)越廣泛,從桌面到服務(wù)器,從操作系統(tǒng)到嵌入式系統(tǒng),從零碎應(yīng)用到整個(gè)產(chǎn)業(yè)形成。因?yàn)閃INDOW影響,人們對(duì)LINUX使用還普遍比較生疏,間接影響LINUX發(fā)展,伴隨LINUX應(yīng)用范圍擴(kuò)大,LINUX熱正在形成,范圍在不停擴(kuò)大,并逐步走出了學(xué)校、研究機(jī)構(gòu),向普及化方向發(fā)展;在LINUX應(yīng)用開發(fā)、嵌入式系統(tǒng)開發(fā)兩大發(fā)展方向上,不論國(guó)際、國(guó)內(nèi)都急需要大量專業(yè)人才。Linux將會(huì)朝著完善功效、提升效率方向發(fā)展,包含允許用戶創(chuàng)建線程、增加實(shí)時(shí)處理功效、開發(fā)適合多處理機(jī)體系結(jié)構(gòu)版本;LINUX桌面系統(tǒng)正在形成,并逐步會(huì)在一些領(lǐng)域取代WINDOW系統(tǒng); 今后操作系統(tǒng)只有:WINDOW、UNIX和LINUX???

第24頁(yè)LINUX系統(tǒng)特點(diǎn)(一)開放性:是指系統(tǒng)遵照世界標(biāo)準(zhǔn)規(guī)范,尤其是遵照開放系統(tǒng)互連(OSI)國(guó)際標(biāo)準(zhǔn)。凡是遵照國(guó)際標(biāo)準(zhǔn)所開發(fā)硬件和軟件,都功效彼此加入,可方便實(shí)現(xiàn)互連。另外,源碼是開放和free,使得LINUX取得非常方便,而且節(jié)約費(fèi)用。用戶能夠依據(jù)自己需要對(duì)部件進(jìn)行混合搭配,建立自定義擴(kuò)展。多用戶:是指系統(tǒng)資源能夠被不一樣用戶各自擁有使用,即每個(gè)用戶對(duì)自己資源(文件、網(wǎng)絡(luò)、空間)有特定權(quán)限,互不影響。多任務(wù):系統(tǒng)能夠同時(shí)執(zhí)行多個(gè)程序,而且各個(gè)程序運(yùn)行相互獨(dú)立。LINUX系統(tǒng)調(diào)度每一個(gè)進(jìn)程平等地訪問(wèn)處理器。出眾速度性能:LINUX能夠理想運(yùn)行數(shù)月、多年而無(wú)須重新開啟,與NT相比,該特點(diǎn)尤其突出。LINUX不大在意CPU速度,它能夠把處理器性能發(fā)揮到極限,用戶會(huì)發(fā)覺:影響系統(tǒng)性能提升限制原因主要是系統(tǒng)總線和IO性能。第25頁(yè)LINUX系統(tǒng)特點(diǎn)(二)良好用戶界面:LINUX向用戶提供了三種界面:用戶命令界面,系統(tǒng)調(diào)用界面和圖形用戶界面。

豐富網(wǎng)絡(luò)功效:LINUX是在Internet基礎(chǔ)上產(chǎn)生并發(fā)展起來(lái),所以,完善內(nèi)置網(wǎng)絡(luò)是Linux一大特點(diǎn)。Linux在通信和網(wǎng)絡(luò)功效方面優(yōu)于其它操作系統(tǒng)

可靠系統(tǒng)安全:LINUX采取了許多安全技術(shù)辦法,包含對(duì)讀寫進(jìn)行權(quán)限控制、帶保護(hù)子系統(tǒng)、審計(jì)跟蹤、關(guān)鍵授權(quán)等,為網(wǎng)絡(luò)多用戶環(huán)境提供了必要安全保障。

良好可移植性:LINUX是一個(gè)可移植操作系統(tǒng),能夠從微型計(jì)算機(jī)到大型計(jì)算機(jī)任何環(huán)境和任何平臺(tái)下運(yùn)行。可移植性為運(yùn)行LINUX不一樣計(jì)算機(jī)平臺(tái)與其它任何機(jī)器進(jìn)行有效通信提供了伎倆,不需要增加特殊和昂貴通信接口。含有標(biāo)準(zhǔn)兼容性:LINUX是一個(gè)與POSIX(PortableOperatingSystemInterface)相兼容操作系統(tǒng),它所組成子系統(tǒng)支持全部相關(guān)ANSI、ISO、IETF和W3C業(yè)界標(biāo)準(zhǔn)。第26頁(yè)LINUX系統(tǒng)組成

LINUX普通有四個(gè)部分組成:內(nèi)核、Shell、文件系統(tǒng)和應(yīng)用程序。內(nèi)核、Shell和文件系統(tǒng)組成了基本操作系統(tǒng)結(jié)構(gòu)。它們使得用戶能夠運(yùn)行程序,管理文件并使用系統(tǒng)。

LINUX內(nèi)核:內(nèi)核是系統(tǒng)“心臟”,是運(yùn)行程序和管理像磁盤和打印機(jī)等硬件設(shè)備關(guān)鍵程序。Linux內(nèi)核主要由存放管理、進(jìn)程管理、設(shè)備管理、進(jìn)程間通信等幾部分組成。

LINUXShell:Shell是系統(tǒng)用戶界面,提供了用戶與內(nèi)核進(jìn)行交互操作一個(gè)接口。

LINUX文件系統(tǒng):文件系統(tǒng)是存放在磁盤等存放設(shè)備上組織方法,LINUX文件系統(tǒng)實(shí)際上也是內(nèi)核一個(gè)主要部分。LINUX支持當(dāng)前流行各種文件系統(tǒng),如:EXT2、EXT3、FAT、VFAT、IISO9660、NFS、JFS、XFS、SMB等。LINUX應(yīng)用程序:標(biāo)準(zhǔn)LINUX系統(tǒng)都有一套稱為應(yīng)用程序程序集合,包含文本編輯器、編程語(yǔ)言、XWindow、辦公套件、Internet工具、數(shù)據(jù)庫(kù)等。

第27頁(yè)LINUX內(nèi)核版本

內(nèi)核版本是Linus領(lǐng)導(dǎo)下開發(fā)小組發(fā)出系統(tǒng)內(nèi)核版本號(hào)。內(nèi)核版本有三個(gè)數(shù)字:r.x.yr:當(dāng)前公布Kernel主版本號(hào)x:Kernel次版本號(hào),偶數(shù):穩(wěn)定版本;奇數(shù):開發(fā)中版本y:錯(cuò)誤修補(bǔ)次數(shù)對(duì)于初學(xué)者,相關(guān)內(nèi)核要記住最主要事是:帶奇數(shù)內(nèi)核版本(即2.3、2.5、2.7等)是試驗(yàn)性開發(fā)版內(nèi)核。穩(wěn)定發(fā)行版內(nèi)核版本號(hào)是偶數(shù)(即2.4、2.6、2.8等)。當(dāng)前LINUX內(nèi)核最新版本為2.6,03年底公布。

第28頁(yè)LINUX發(fā)行版本

發(fā)行版本是一些組織和廠家將LINUX系統(tǒng)內(nèi)核與應(yīng)用軟件和文檔包裝起來(lái),并提供一些安裝界面和系統(tǒng)管理工具一個(gè)軟件包集合。其中,Linux發(fā)行版中出現(xiàn)許多系統(tǒng)級(jí)別和用戶級(jí)別工具都來(lái)自自由軟件基金會(huì)(FreeSoftwareFoundation)GNU項(xiàng)目。當(dāng)前LINUX發(fā)行版本已經(jīng)有300余種,而且還在不停增加。相對(duì)于內(nèi)核版本,發(fā)行套件版本號(hào)伴隨公布者不一樣而不一樣,與系統(tǒng)級(jí)內(nèi)核版本號(hào)是相對(duì)獨(dú)立。第29頁(yè)國(guó)際著名一些LINUX發(fā)行版本

RedHat—最著名Linux服務(wù)提供商,Intel、Dell等大企業(yè)都對(duì)其有較大投資,該企業(yè)前很快收購(gòu)了開放源代碼工具供給商Cygnus企業(yè)。SlackWare—?dú)v史比較悠久,有一定用戶基礎(chǔ)。SUSE—在歐洲著名度較大。

TurboLinux—在亞洲,尤其是日本用戶較多。該企業(yè)在中國(guó)推出了TurboLinux4.0、4.02和6.0漢字版,漢化做得很出眾。Debain—完全由計(jì)算機(jī)興趣者和Linux小區(qū)計(jì)算機(jī)高手維護(hù)Linux公布版本。第30頁(yè)國(guó)內(nèi)著名一些LINUX發(fā)行版本

Linux進(jìn)入中國(guó)后,在我國(guó)計(jì)算機(jī)界引發(fā)了強(qiáng)烈反響,最近兩年,也出現(xiàn)了許多漢化Linux公布版本,影響較大有以下幾個(gè):XteamLinux—北京沖浪平臺(tái)企業(yè)推出產(chǎn)品,中國(guó)第一套漢化Linux公布版本。BluePoint—1999年底正式推出產(chǎn)品,內(nèi)核漢化技術(shù)頗受矚目。RedflagLinux—中國(guó)科學(xué)院軟件研究所和北大方正推出Linux公布版本。第31頁(yè)LINUX支持標(biāo)準(zhǔn)LINUX符合POSIX1003.1標(biāo)準(zhǔn)

,POSIX1003.1標(biāo)準(zhǔn)定義了一個(gè)最小Unix操作系統(tǒng)接口,任何操作系統(tǒng)只有符合這一標(biāo)準(zhǔn),才有可能運(yùn)

行Unix程序。為了使UnixSystemV和BSD上程序能直接在Linux上運(yùn)行,Linux還增加了部分SystemV和BSD系統(tǒng)接口,使Linux成為一個(gè)完善Unix程序開發(fā)系統(tǒng)。

第32頁(yè)LINUX遵照標(biāo)準(zhǔn)說(shuō)明POSIX:該標(biāo)準(zhǔn)最初由IEEE(電氣和電子工程師協(xié)會(huì))開發(fā)標(biāo)準(zhǔn)族,部分已經(jīng)被ISO接收為國(guó)際標(biāo)準(zhǔn)。POSIX.1和POSIX.2

分別定義了POSIX兼容操作系統(tǒng)C語(yǔ)言系統(tǒng)接口

以及shell和工具標(biāo)準(zhǔn)。這兩個(gè)標(biāo)準(zhǔn)是通常提到主要標(biāo)準(zhǔn)。SVID:SystemV接口描述。SystemV接口描述(SVID)是描述AT&T;UnixSystemV操作系統(tǒng)文檔,是對(duì)POSIX標(biāo)準(zhǔn)擴(kuò)展超集。

XPG:X/Open可移植性指南。X/Open可移植性指南(由X/OpenCompany,Ltd.出版),是比POSIX更為普通標(biāo)準(zhǔn)。X/Open擁有Unix版權(quán),而XPG則指定成為Unix操作系統(tǒng)必須滿足要求。第33頁(yè)LSB(LinuxStandardsBase)

Linux標(biāo)準(zhǔn)基礎(chǔ)LSB推出背景

因?yàn)長(zhǎng)INUX發(fā)行商眾多,為了防止不一樣發(fā)行商對(duì)程序兼容性等問(wèn)題帶來(lái)影響,由四家領(lǐng)袖級(jí)Linux提供商發(fā)起了成立了LINUX協(xié)會(huì)工程UnitedLinux。致力于提供改進(jìn)公共代碼庫(kù),提供特定于Linux工業(yè)規(guī)范和認(rèn)證計(jì)劃,Linux標(biāo)準(zhǔn)基礎(chǔ)(LinuxStandardsBase,LSB)規(guī)范意在消除各Linux分發(fā)版之間許多區(qū)分,其目標(biāo)是讓軟件廠商更輕易地制作能夠在許多企業(yè)不一樣版本開源軟件操作系統(tǒng)上運(yùn)行程序,支持Linux應(yīng)用程序市場(chǎng)。第34頁(yè)LSB細(xì)則LSB認(rèn)證是由FreeStandardsGroup提供獨(dú)立于Linux版本發(fā)行商第三方認(rèn)證,確保產(chǎn)品符合面向Linux發(fā)行套件及支持Linux應(yīng)用程序業(yè)界標(biāo)準(zhǔn)規(guī)格。LSB認(rèn)證內(nèi)容包含公共規(guī)格(gLSB)和特殊架構(gòu)規(guī)格(archLSB)認(rèn)證,其中g(shù)LSB定義了那些基于LSB程序在運(yùn)行過(guò)程各模塊間標(biāo)準(zhǔn)接口,archLSB定義了基于不一樣架構(gòu)處理器(CPU)標(biāo)準(zhǔn)接口LSB內(nèi)容主要覆蓋文件系統(tǒng)設(shè)計(jì),二進(jìn)制格式(包含可執(zhí)行和共享庫(kù)),系統(tǒng)命令,scripts等內(nèi)容。而POSIX標(biāo)準(zhǔn)和LSB標(biāo)準(zhǔn)之間有不少交融地方。FSG提供文檔以及測(cè)試工具、一致性測(cè)試等都是無(wú)償。第35頁(yè)LSB帶來(lái)好處促進(jìn)Linux平臺(tái)標(biāo)準(zhǔn)化,使得Linux工業(yè)標(biāo)準(zhǔn)早日形成,防止Linux陷入互不兼容泥沼,重蹈Unix陣營(yíng)分裂覆轍。意在促進(jìn)Linux國(guó)際化Li18nux等業(yè)已形成標(biāo)準(zhǔn)遵照。降低個(gè)別企業(yè)軟件開發(fā)成本,節(jié)約資源以防止無(wú)須要重覆浪費(fèi),使得對(duì)Linux開發(fā)企業(yè)有一個(gè)可靠營(yíng)利模式,同時(shí)兼顧Linux可自由傳布特征

第36頁(yè)LSB現(xiàn)實(shí)狀況開源軟件支持者自由標(biāo)準(zhǔn)組織(FreeStandardsGroup)于

年7月發(fā)表LSB

1.0測(cè)試版,于04年1月,向大眾公布了其LSB2.0版Linux開發(fā)指南

LSB(2.0)功效支持PPC64、AMD64、IA64、PPC32、S390和S390X等許多處理器架構(gòu)。已經(jīng)制作LSB認(rèn)證Linux產(chǎn)品軟件開發(fā)商包含RedHat、Turbolinux、

SuSELinux、MandrakeSoft、Conectiva、Laboratory、SunWahLinux、ThizLinux和Progeny等。

第37頁(yè)LINUX在線文檔 man,即manunal,是

LINUX

系統(tǒng)手冊(cè)電子版本。依據(jù)習(xí)慣,系統(tǒng)手冊(cè)通常分為不一樣部分(或小節(jié),即section),每個(gè)小節(jié)闡述不一樣系統(tǒng)內(nèi)容。當(dāng)前小節(jié)劃分以下:1.

命令:普通用戶命令2.

系統(tǒng)調(diào)用:內(nèi)核接口3.

函數(shù)庫(kù)調(diào)用:普通函數(shù)庫(kù)中函數(shù)4.

特殊文件:/dev目錄中特殊文件5.

文件格式和約定:/etc/passwd等文件格式6.

游戲程序命令。7.

雜項(xiàng)和約定:標(biāo)準(zhǔn)文件系統(tǒng)布局、手冊(cè)頁(yè)結(jié)構(gòu)等雜項(xiàng)內(nèi)容8.

系統(tǒng)管理命令。9.

內(nèi)核例程:非標(biāo)準(zhǔn)手冊(cè)小節(jié)。便于Linux內(nèi)核開發(fā)而包含。

手冊(cè)頁(yè)普通保留在/usr/share/man目錄下,其中每個(gè)子目錄(如man1,man2,...,manl,mann)包含不一樣手冊(cè)小節(jié)

第38頁(yè)man命令man命令行:man[-acdfFhkKtwW][-msystem][-pstring][-Cconfig_file][-Mpath][-Ppager][-Ssection_list][section]name

-M路徑

,指定搜索man手冊(cè)頁(yè)路徑,通常這個(gè)路徑由環(huán)境變量MANPATH預(yù)設(shè),假如在命令行上指定另外路徑,則覆蓋MANPATH設(shè)定。

-P命令

,指定所使用分頁(yè)程序。-a顯示全部手冊(cè)頁(yè),而不是只顯示第一個(gè)。

-d這個(gè)選項(xiàng)主要在檢驗(yàn)時(shí)使用,假如用戶加入了一個(gè)新文件,就能夠用這個(gè)選項(xiàng)檢驗(yàn)是否犯錯(cuò),這個(gè)選項(xiàng)并不會(huì)列出文件內(nèi)容。

-f只顯示出命令功效而不顯示其中詳細(xì)說(shuō)明文件。

-pstring設(shè)定運(yùn)行預(yù)先處理程序次序,共有以下幾項(xiàng):

eeqnttbl,ggraprrefer,ppicvvgrind

-w不顯示手冊(cè)頁(yè),只顯示文檔文件所在位置。

第39頁(yè)info Linux中大多數(shù)軟件開發(fā)工具都是來(lái)自自由軟件基金會(huì)GNU項(xiàng)目,這些工具軟件件在線文檔都以info文件形式存在。info程序是GNU超文本幫助系統(tǒng)。

info文檔普通保留在/usr/info目錄下,使用info命令查看info文檔。要運(yùn)行info,能夠在shell提醒符后輸入info,也能夠在GNUemacs中鍵入Esc-x后跟info。

info幫助系統(tǒng)初始屏幕顯示了一個(gè)主題目錄,你能夠?qū)⒐鈽?biāo)移動(dòng)到帶有*主題菜單上面,然后按回車鍵進(jìn)入該主題,也能夠鍵入m,后跟主題菜單名稱而進(jìn)入該主題。比如,你能夠鍵入m,然后再鍵入gcc而進(jìn)進(jìn)入gcc主題中。 詳細(xì)子命令省略第40頁(yè)HOWTO 可供用戶參考聯(lián)機(jī)文檔另一個(gè)形式是HOWTO文件,這些文件位于系統(tǒng)/usr/doc/HOWTO目錄下。HOWTO文件文件名都有一個(gè)-HOWTO后綴,而且都是文本文件或html格式。 每一個(gè)HOWTO文件包含Linux某首先信息,比如它支持硬件或怎樣建立一個(gè)引導(dǎo)盤,關(guān)于glibc、gcc、Java、SMB等。

要想查看這些文件,進(jìn)入/usr/doc/HOWTO目錄,使用more命令,詳細(xì)形式以下:$cd/usr/doc/HOWTO;moretopic-name-HOWTO 另外,HOWTO文檔還有其它格式文件,比如:HTML和PS等,保留在/usr/doc/HOWTO/other-formats下。

第41頁(yè)LINUX慣用輔助在線命令help命令用于查看全部Shell命令。用戶能夠經(jīng)過(guò)該命令尋求Shell命令使用方法,只需在所查找命令后輸入help命令,就能夠看到所查命令內(nèi)容了。如:$helptestWhereis這個(gè)程序主要功效是尋找一個(gè)命令目標(biāo)碼、源碼和文檔所在位置。比如,我們最慣用ls命令,它是在/bin這個(gè)目錄下。假如希望知道某個(gè)命令存在哪一個(gè)目錄下,能夠用whereis命令來(lái)查詢,主要參數(shù):

b只查找二進(jìn)制文件

m查找主要文件

s查找起源 u查找不慣用統(tǒng)計(jì)文件

如:$whereisls執(zhí)行后輸出:ls:/bin/ls/usr/share/man/man1/ls.1.gzapropos搜索聯(lián)機(jī)文檔中與匹配字符相關(guān)條目。

第42頁(yè)LINUXFAQUNIX和Linux有什么不一樣?

為何Linux很主要?

我能用Linux做什么?

怎樣開始學(xué)習(xí)Linux?

怎樣在應(yīng)用開發(fā)中使用Linux?

Linux上能夠使用哪些編程語(yǔ)言?

LINUX適應(yīng)性

。。。。。。第43頁(yè)LINUX不足

Linux從出現(xiàn)到現(xiàn)今只經(jīng)歷了短短十年時(shí)間,但其發(fā)展速度是驚人,這與它開放性和優(yōu)良性能是密不可分。不過(guò)我們應(yīng)該看到,作為一個(gè)由學(xué)生開發(fā)系統(tǒng),Linux還有許多先天不足,它設(shè)計(jì)思想過(guò)多地受到傳統(tǒng)操作系統(tǒng)約束,沒有表達(dá)出當(dāng)今操作系統(tǒng)發(fā)展時(shí)尚,詳細(xì)表現(xiàn)在以下幾個(gè)方面:

不是一個(gè)微內(nèi)核操作系統(tǒng);

不是一個(gè)分布式操作系統(tǒng);

不是一個(gè)安全操作系統(tǒng)

沒有用戶線程;

不支持實(shí)時(shí)處理;代碼是用C而不是C++這么當(dāng)代程序設(shè)計(jì)語(yǔ)言編寫

盡管Linux有這么和那樣不足,但其發(fā)展?jié)摿Σ蝗莸凸?,其發(fā)展動(dòng)力就是遍布全球、為數(shù)眾多Linux熱心者,今后Linux將會(huì)朝著愈加完善功效化方向發(fā)展?;蛟S,正是因?yàn)樯厦娌蛔悴攀沟肔INUX發(fā)展沒有受到更多束縛。

第44頁(yè)LINUX應(yīng)用前景

Linux開放性和靈活性使它得以在試驗(yàn)室和其它研究機(jī)構(gòu)中被用于創(chuàng)新性技術(shù)變革前沿,Linux健壯和開放靈活性意味著它在今后很多年都將處于開發(fā)戰(zhàn)線最前沿。高性能計(jì)算領(lǐng)域美國(guó)ASCI(加速戰(zhàn)略計(jì)算創(chuàng)新)計(jì)劃中多臺(tái)機(jī)器采取Linux操作系統(tǒng)年11月16日公布TOP500中前十名機(jī)器中第五、六名分別采取了LINUX操作系統(tǒng),其處理器數(shù)量到達(dá)2816和2304。國(guó)內(nèi)機(jī)群系統(tǒng)幾乎都采取LINUX操作系統(tǒng)服務(wù)器領(lǐng)域桌面系統(tǒng)嵌入式系統(tǒng)

安全平臺(tái)第45頁(yè)LINUX應(yīng)用

——網(wǎng)上兩條新聞IBM首席信息官BobGreenberg撰寫《按需計(jì)算計(jì)劃初步》內(nèi)部備忘錄,由IBM企業(yè)一名員工泄露了出來(lái)。在備忘錄中,能夠看出IBM有意到底轉(zhuǎn)向Linux桌面系統(tǒng),新OpenDesktop很有可能是完全取代Windows一套全新桌面工作環(huán)境中國(guó)RedFlagSoftware和日本MiracleLinux企業(yè)攜手合作,目標(biāo)是開發(fā)一個(gè)公共Linux平臺(tái),方便讓亞洲企業(yè)輕松投入開放源代碼陣營(yíng)。

第46頁(yè)LINUX在中國(guó)應(yīng)用

——中國(guó)Linux標(biāo)準(zhǔn)呼之欲出四份規(guī)范草案已完成

Linux國(guó)家標(biāo)準(zhǔn)工作組當(dāng)前已經(jīng)完成對(duì)Linux應(yīng)用編程界面(API)規(guī)范、Linux桌面操作系統(tǒng)技術(shù)規(guī)范、Linux服務(wù)器操作系統(tǒng)技術(shù)規(guī)范、Linux用戶界面等四個(gè)方面規(guī)范草案編寫,并進(jìn)入社會(huì)征求意見征求階段。 Linux國(guó)家標(biāo)準(zhǔn)工作組已經(jīng)申請(qǐng)了863計(jì)劃Linux、Office關(guān)鍵技術(shù)標(biāo)準(zhǔn)項(xiàng)目,該項(xiàng)工作從Linux標(biāo)準(zhǔn)體系研究著手,重點(diǎn)開啟了漢字特征,桌面系統(tǒng)技術(shù),服務(wù)器系統(tǒng)技術(shù),用戶圖形界面環(huán)境研究等工作。第47頁(yè)GNU通用公共許可證

——(GNUGeneralPublicLicense,GNUGPL)

UNIX發(fā)展帶來(lái)問(wèn)題Unix正式誕生:1973年Ritchie等人以C語(yǔ)言寫出第一個(gè)正式Unix關(guān)鍵

主要Unix分支:1977年BSD誕生

百家齊鳴Unix版本GPL誕生Stallman在1984年創(chuàng)建了GNU與

自由軟件基金會(huì)他創(chuàng)作了許多自由軟件供大眾來(lái)使用,對(duì)于其作品以自由(free)GNUGeneralPublicLicense(GPL)授權(quán)模式提供大眾使用 FSF關(guān)鍵觀念是:版權(quán)制度是促進(jìn)社會(huì)進(jìn)步伎倆,版權(quán)本身不是自然權(quán)力第48頁(yè)GNU主要規(guī)則

Stallman先生對(duì)自由度下了這么直接說(shuō)明:你能夠依據(jù)任何你想要目標(biāo)來(lái)運(yùn)行這個(gè)Free程序;你能夠在了解了這支個(gè)Free程序運(yùn)作之后,將他修改成你所想要樣式與功效;

你能夠?qū)⒛阕约盒薷倪^(guò)Free程序再次發(fā)表,以幫助你朋友們;

你能夠?qū)⑦@支Free程序進(jìn)行改良,并將改良過(guò)程序公開發(fā)表,以造福社群。

簡(jiǎn)單來(lái)說(shuō),GPL授權(quán)含有幾個(gè)特點(diǎn):

任何軟件掛上GPL授權(quán)之后,即為自由軟件,任何人均可取得,同時(shí),亦可取得其原始碼(SourceCode);取得GPL授權(quán)之軟件后,任何人均可進(jìn)行修改原始碼,以符合自己喜好;

除此之外,經(jīng)過(guò)修改SourceCode應(yīng)回報(bào)給網(wǎng)絡(luò)社會(huì),提供大家來(lái)參考!

第49頁(yè)怎樣了解GPL大多數(shù)軟件許可證都被用來(lái)剝奪您享受和改變它自由,但和它們不一樣,GNU通用公共許可證是用來(lái)確保您分享和改變無(wú)償軟件權(quán)利——確保軟件對(duì)全部用戶都是無(wú)償。這個(gè)通用公共許可證,適合用于無(wú)償軟件聯(lián)盟大部分軟件和其它經(jīng)過(guò)作者允許使用程序(有些其它無(wú)償軟件聯(lián)盟軟件由GNU庫(kù)通用公共許可證所包含)。這里說(shuō)到無(wú)償軟件,指是自由,而不是價(jià)格,設(shè)計(jì)通用公共許可證目標(biāo)是為了確保您有發(fā)行無(wú)償軟件拷貝權(quán)利。確保當(dāng)您需要時(shí)能得到源代碼,確保您能夠改變軟件或在其它新無(wú)償程序中使用其中部分。盡管GNU通用公共許可證要求將修改過(guò)代碼公布給使用該代碼客戶,但它不要求將全部修改后代碼都公布給公眾(這是一些自由軟件批評(píng)者沒有領(lǐng)會(huì)關(guān)鍵一點(diǎn))。確實(shí),GNUGPL只要求使用代碼客戶能夠取得修改后代碼。用戶自行設(shè)計(jì)代碼,如:發(fā)行版本中一些內(nèi)容,不屬于此列。第50頁(yè)本章小結(jié)本章從介紹自由軟件三種模式開始,引入了自由軟件典范LINUX起源,分析了LINUX發(fā)展現(xiàn)實(shí)狀況和未來(lái)趨勢(shì)。介紹了LINUX系統(tǒng)特點(diǎn)和組成,LINUX內(nèi)核版本和發(fā)行版本差異,及LINUX遵照主要標(biāo)準(zhǔn)及LSB認(rèn)證。LINUX在線文檔學(xué)習(xí)是一個(gè)主要基礎(chǔ)性知識(shí)最終經(jīng)過(guò)對(duì)GNUGPL通用許可證一些知識(shí)能夠加深我們對(duì)LINUX了解和支持。第51頁(yè)第二章LINUX用戶程序環(huán)境

第52頁(yè)Linux下C語(yǔ)言編程

Linux發(fā)行版中包含了很多軟件開發(fā)工具.它們中很多是用于C和C++應(yīng)用程序開發(fā).

什么是CC是一個(gè)在UNIX操作系統(tǒng)早期就被廣泛使用通用編程語(yǔ)言.它最早是由貝爾試驗(yàn)室DennisRitchie為了UNIX輔助開發(fā)而寫.

C在編程領(lǐng)域里得到廣泛支持原因它是一個(gè)非常通用語(yǔ)言.幾乎你所能想到任何一個(gè)計(jì)算機(jī)上都有最少一個(gè)能用C編譯器.而且它語(yǔ)法和函數(shù)庫(kù)在不一樣平臺(tái)上都是統(tǒng)一,

這個(gè)特征對(duì)開發(fā)者來(lái)說(shuō)很有吸引力.用C寫程序執(zhí)行速度很快.C是全部版本UNIX上系統(tǒng)語(yǔ)言.第53頁(yè)ANSIC標(biāo)準(zhǔn)ANSIC:這一標(biāo)準(zhǔn)是ANSI(美國(guó)國(guó)家標(biāo)準(zhǔn)局)于1989年制訂C語(yǔ)言標(biāo)準(zhǔn),確保了未來(lái)在不一樣平臺(tái)上C一致性.。

以后被ISO(國(guó)際標(biāo)準(zhǔn)化組織)接收為標(biāo)準(zhǔn),所以也稱為ISOC。ANSIC目標(biāo)是為各種操作系統(tǒng)上C程序提供可移植性確保,而不但僅限于UNIX。

該標(biāo)準(zhǔn)不但定義了C編程語(yǔ)言語(yǔ)發(fā)和語(yǔ)義,而且還定義了一個(gè)標(biāo)準(zhǔn)庫(kù)。這個(gè)庫(kù)能夠依據(jù)

頭文件劃分為15個(gè)部分,其中包含:字符類型(<ctype.h>)、錯(cuò)誤碼(<errno.h>)、

浮點(diǎn)常數(shù)(<float.h>)、數(shù)學(xué)常數(shù)(<math.h>)、標(biāo)準(zhǔn)定義(<stddef.h>)、

標(biāo)準(zhǔn)I/O(<stdio.h>)、工具函數(shù)(<stdlib.h>)、字符串操作(<string.h>)、

時(shí)間和日期(<time.h>)、可變參數(shù)表(<stdarg.h>)、信號(hào)(<signal.h>)、

非局部跳轉(zhuǎn)(<setjmp.h>)、當(dāng)?shù)匦畔?<local.h>)、程序斷言(<assert.h>)等等。

第54頁(yè)GCC介紹Linux上可用C編譯器是GNUC編譯器,它建立在自由軟件基金會(huì)編程許可證基礎(chǔ)上,所以能夠自由公布.你能在Linux發(fā)行光盤上找到它.GCC是GNUC和C++編譯器。實(shí)際上,GCC能夠編譯三種語(yǔ)言:C、C++和ObjectC(C語(yǔ)言一個(gè)面向?qū)ο髷U(kuò)展)。利用gcc命令可同時(shí)編譯并連接C和C++源程序。

第55頁(yè)使用GCCgcc命令基本使用方法以下:

gcc[options][filenames]GCC慣用選項(xiàng)-c

選項(xiàng)告訴GCC僅把源代碼編譯為目標(biāo)代碼而跳過(guò)匯編和連接步驟.這個(gè)選項(xiàng)使用非常頻繁因?yàn)樗沟镁幾g多個(gè)C程序時(shí)速度更加快而且更易于管理.缺省時(shí)GCC建立目標(biāo)代碼文件有一個(gè)

.o

擴(kuò)展名.-S選項(xiàng)告訴GCC在為C代碼產(chǎn)生了匯編語(yǔ)言文件后停頓編譯.GCC產(chǎn)生匯編語(yǔ)言文件缺省擴(kuò)展名是.s.-E選項(xiàng)指示編譯器僅對(duì)輸入文件進(jìn)行預(yù)處理.當(dāng)這個(gè)選項(xiàng)被使用時(shí),預(yù)處理器輸出被送到標(biāo)準(zhǔn)輸出而不是儲(chǔ)存在文件里.-v選項(xiàng)指示編譯時(shí)列出編譯過(guò)程每個(gè)階段,如:預(yù)處理、匯編器、連接器,并列出每個(gè)階段命令執(zhí)行時(shí)詳細(xì)信息。

第56頁(yè)GCC優(yōu)化選項(xiàng)

當(dāng)你用GCC編譯C代碼時(shí),它會(huì)試著用最少時(shí)間完成編譯而且使編譯后代碼易于調(diào)試.易于調(diào)試意味著編譯后代碼與源代碼有一樣執(zhí)行次序,編譯后代碼沒有經(jīng)過(guò)優(yōu)化.有很多項(xiàng)選擇項(xiàng)可用于告訴GCC在花費(fèi)更多編譯時(shí)間和犧牲易調(diào)試性基礎(chǔ)上產(chǎn)生更小更加快可執(zhí)行文件.這些選項(xiàng)中最經(jīng)典是-O

-O2

選項(xiàng).

-O0不優(yōu)化-O/O1選項(xiàng)告訴GCC對(duì)源代碼進(jìn)行基本優(yōu)化,主要是循環(huán)優(yōu)化和跳轉(zhuǎn)優(yōu)化,普通該選項(xiàng)為缺省值.這些優(yōu)化在大多數(shù)情況下都會(huì)使程序執(zhí)行更加快.-O2選項(xiàng)告訴GCC產(chǎn)生盡可能小和盡可能快代碼.-O2選項(xiàng)將使編譯速度比使用-O時(shí)慢.但通常產(chǎn)生代碼執(zhí)行速度會(huì)更加快.主要優(yōu)化策略包含:公共子表示式刪除,運(yùn)算強(qiáng)度弱化(strengthreduce),窺孔優(yōu)化以及指令調(diào)度-O3選項(xiàng)除了進(jìn)行O2相關(guān)優(yōu)化外,還進(jìn)行內(nèi)聯(lián)優(yōu)化和存放器重命名優(yōu)化還有一些優(yōu)化選項(xiàng)在O3中也沒有,比如,循環(huán)展開、數(shù)據(jù)預(yù)取、以及指令投機(jī)調(diào)度等,這些優(yōu)化就要加專門優(yōu)化選項(xiàng)才行。第57頁(yè)調(diào)試和剖析選項(xiàng)

GCC支持?jǐn)?shù)種調(diào)試和剖析選項(xiàng).在這些選項(xiàng)里你會(huì)最慣用到是

-g

-pg選項(xiàng).-g選項(xiàng)告訴GCC產(chǎn)生能被GNU調(diào)試器使用調(diào)試信息方便調(diào)試你程序.GCC提供了一個(gè)很多其它C編譯器里沒有特征,在GCC里你能使-g和-O(產(chǎn)生優(yōu)化代碼)聯(lián)用.這一點(diǎn)非常有用因?yàn)槟隳茉谂c最終產(chǎn)品盡可能相近情況下調(diào)試你代碼.在你同時(shí)使用這兩個(gè)選項(xiàng)時(shí)你必須清楚你所寫一些代碼已經(jīng)在優(yōu)化時(shí)被GCC作了改動(dòng).-pg選項(xiàng)告訴GCC在你程序里加入額外代碼,執(zhí)行時(shí),產(chǎn)生gprof用剖析信息以顯示你程序耗時(shí)情況.第58頁(yè)GCC主要命令選項(xiàng)-ansi只支持ANSI標(biāo)準(zhǔn)C語(yǔ)法,將禁止GNUC一些特色-c 只編譯并生成目標(biāo)文件。-DMACRO 以字符串“1”定義MACRO宏。-DMACRO=DEFN 以字符串“DEFN”定義MACRO宏。-E 只運(yùn)行C預(yù)編譯器。-g 生成調(diào)試信息。GNU調(diào)試器可利用該信息。-IDIRECTORY 指定額外頭文件搜索路徑DIRECTORY。-LDIRECTORY 指定額外函數(shù)庫(kù)搜索路徑DIRECTORY。-lLIBRARY 連接時(shí)搜索指定函數(shù)庫(kù)LIBRARY。-oFILE 生成指定輸出文件。用在生成可執(zhí)行文件時(shí)。-O0 不進(jìn)行優(yōu)化處理。-O或-O1-O2 優(yōu)化生成代碼。-O2 深入優(yōu)化。-O3 比-O2更深入優(yōu)化,包含inline函數(shù)。-shared 生成共享目標(biāo)文件。通慣用在建立共享庫(kù)時(shí)。-static 禁止使用共享連接。-UMACRO 取消對(duì)MACRO宏定義。-w 不生成任何警告信息。-Wall 生成全部警告信息。

第59頁(yè)GNUmake 在大型開發(fā)項(xiàng)目中,通常有幾十到上百個(gè)源文件,假如每次手工鍵入gcc命令進(jìn)行編譯話,則會(huì)非常不方便。所以,人們通常利用make工具來(lái)自動(dòng)完成編譯工作。假如僅修改了某幾個(gè)源文件,則只重新編譯這幾個(gè)源文件;假如某個(gè)頭文件被修改了,則重新編譯全部包含該頭文件源文件。 利用這種自動(dòng)編譯可大大簡(jiǎn)化開發(fā)工作,防止無(wú)須要重新編譯。實(shí)際上,make工具經(jīng)過(guò)一個(gè)稱為makefile文件來(lái)完成并自動(dòng)維護(hù)編譯工作。makefile需要按照某種語(yǔ)法進(jìn)行編寫,其中說(shuō)明了怎樣編譯各個(gè)源文件并連接生成可執(zhí)行文件,并定義了源文件之間依賴關(guān)系。當(dāng)修改了其中某個(gè)源文件時(shí),假如其它源文件依賴于該文件,則也要重新編譯全部依賴該文件源文件。

第60頁(yè)GNUmake調(diào)用規(guī)則 默認(rèn)情況下,GNUmake工具在當(dāng)前工作目錄中按以下次序搜索makefile:GNUmakefilemakefileMakefile 在UNIX系統(tǒng)中,習(xí)慣使用Makefile作為makfile文件。假如要使用其它文件作為makefile,則可利用類似下面make命令選項(xiàng)指定makefile文件:

$make-fMakefile.debug

第61頁(yè)makefile基本結(jié)構(gòu)makefile中普通包含以下內(nèi)容:make工具創(chuàng)建項(xiàng)目,通常是目標(biāo)文件和可執(zhí)行文件。通常使用“目標(biāo)(target)”一詞來(lái)表示要?jiǎng)?chuàng)建項(xiàng)目。

要?jiǎng)?chuàng)建項(xiàng)目依賴于哪些文件。

創(chuàng)建每個(gè)項(xiàng)目時(shí)需要運(yùn)行命令。

一個(gè)makefile文件中可定義多個(gè)目標(biāo),利用maketarget命令可指定要編譯目標(biāo),假如不指定目標(biāo),則使用第一個(gè)目標(biāo) 通常,makefile中定義有clean目標(biāo),可用來(lái)去除編譯過(guò)程中中間文件;第62頁(yè)Makefile應(yīng)用示例

比如,假設(shè)你現(xiàn)在有一個(gè)C++源文件test.C,該源文件包含有自定義頭文件test.h,則目標(biāo)文件test.o明確依賴于兩個(gè)源文件:test.C和test.h。另外,你可能只希望利用g++命令來(lái)生成test.o目標(biāo)文件。這時(shí),就能夠利用以下makefile來(lái)定義test.o創(chuàng)建規(guī)則:

#Thismakefilejustisaexample.

test.o:test.Ctest.h g++-c-gtest.C

clean:rm-f*.o

第63頁(yè)Makefile變量 GNUmake工具除提供建立目標(biāo)基本功效之外,還有許多便于表示依賴性關(guān)系以及建立目標(biāo)命令特色。其中之一就是變量或宏定義能力。假如你要以相同編譯選項(xiàng)同時(shí)編譯十幾個(gè)C源文件,而為每個(gè)目標(biāo)編譯指定冗長(zhǎng)編譯選項(xiàng)話,將是非常乏味。但利用簡(jiǎn)單變量定義,可防止這種乏味工作:

#DefinemacrosfornameofcompilerCC=gcc

#DefineamacrofortheCCflagsCCFLAGS=-D_DEBUG-g-m486

#Aruleforbuildingaobjectfiletest.o:test.ctest.h $(CC)-c$(CCFLAGS)test.c

在上面例子中,CC和CCFLAGS就是make變量。GNUmake通常稱之為變量,而其它UNIXmake工具稱之為宏,實(shí)際是同一個(gè)東西。在makefile中引用變量值時(shí),只需變量名之前添加$符號(hào),如上面$(CC)和$(CCFLAGS)。

第64頁(yè)GNUmake預(yù)定義變量(一)

GNUmake有許多預(yù)定義變量,這些變量含有特殊含義,可在規(guī)則中使用。下表給出了一些主要預(yù)定義變量,除這些變量外,GNUmake還將全部環(huán)境變量作為自己預(yù)定義變量。$* 不包含擴(kuò)展名目標(biāo)文件名稱。$+ 全部依賴文件,以空格分開,并以出現(xiàn)先后為序,可 能包含重復(fù)依賴文件。$^ 全部依賴文件,以空格分開,不包含重復(fù)依賴文件。$? 全部依賴文件,以空格分開,這些依賴文件修改日期 比目標(biāo)創(chuàng)建日期晚(依賴文件最近修改過(guò))。$< 第一個(gè)依賴文件名稱。$@ 目標(biāo)完整名稱。$%假如目標(biāo)是歸檔組員,則該變量表示目標(biāo)歸檔組員名稱。

比如,假如目標(biāo)名稱為mytarget.so(image.o),

則$@為mytarget.so,而$%為image.o。

第65頁(yè)GNUmake預(yù)定義變量(二)AR 歸檔維護(hù)程序名稱,默認(rèn)值為ar。ARFLAGS歸檔維護(hù)程序選項(xiàng)。AS 匯編程序名稱,默認(rèn)值為as。ASFLAGS匯編程序選項(xiàng)。CC C編譯器名稱,默認(rèn)值為cc。CCFLAGSC編譯器選項(xiàng)。CPP C預(yù)編譯器名稱,默認(rèn)值為$(CC)-E。CPPFLAGSC預(yù)編譯選項(xiàng)。CXX C++編譯器名稱,默認(rèn)值為g++。CXXFLAGSC++編譯器選項(xiàng)。FC FORTRAN編譯器名稱,默認(rèn)值為f77。FFLAGSFORTRAN編譯器選項(xiàng)。

第66頁(yè)GNUmake隱含規(guī)則

GNUmake包含有一些內(nèi)置或隱含規(guī)則,這些規(guī)則定義了怎樣從不一樣依賴文件建立特定類型目標(biāo)。GNUmake支持兩種類型隱含規(guī)則

后綴規(guī)則(SuffixRule)。后綴規(guī)則是定義隱含規(guī)則老格調(diào)方法。后綴規(guī)則定義了將一個(gè)含有某個(gè)后綴文件(比如,.c文件)轉(zhuǎn)換為含有另外一個(gè)后綴文件(比如,.o文件)方法。每個(gè)后綴規(guī)則以兩個(gè)成對(duì)出現(xiàn)后綴名定義,比如,將.c文件轉(zhuǎn)換為.o文件后綴規(guī)則可定義為:

.c.o: $(CC)$(CCFLAGS)$(CPPFLAGS)-c-o$@$<

模式規(guī)則(patternrules)。這種規(guī)則愈加通用,因?yàn)槟軌蚶媚J揭?guī)則定義愈加復(fù)雜依賴性規(guī)則。模式規(guī)則看起來(lái)非常類似于正則規(guī)則,但在目標(biāo)名稱前面多了一個(gè)%號(hào),同時(shí)可用來(lái)定義目標(biāo)和依賴文件之間關(guān)系,例以下面模式規(guī)則定義了怎樣將任意一個(gè)X.c文件轉(zhuǎn)換為X.o文件:

%.c:%.o $(CC)$(CCFLAGS)$(CPPFLAGS)-c-o$@$<

第67頁(yè)函數(shù)庫(kù)-glibc C語(yǔ)言并沒有為常見操作,比如輸入/輸出、內(nèi)存管理,字符串操作等提供內(nèi)置支持。這些功效普通由標(biāo)準(zhǔn)“函數(shù)庫(kù)”來(lái)提供。GNUC函數(shù)庫(kù),即glibc,是Linux上最主要函數(shù)庫(kù),它定義了ISOC標(biāo)準(zhǔn)指定全部庫(kù)函數(shù),以及由POSIX或其它UNIX操作系統(tǒng)統(tǒng)變種指定附加特色,還包含有與GNU系統(tǒng)相關(guān)擴(kuò)展。當(dāng)前,流行Linux系統(tǒng)使用glibc2.0以上版本。glibc基于標(biāo)準(zhǔn)包含:

ISOC:C編程語(yǔ)言國(guó)際標(biāo)準(zhǔn),即ANSIC

POSIX:GNUC函數(shù)庫(kù)實(shí)現(xiàn)了ISO/IEC9945-1:1996(POSIX系統(tǒng)應(yīng)用程序編程接口,

即POSIX.1)指定全部函數(shù)。該標(biāo)準(zhǔn)是對(duì)ISOC擴(kuò)展,包含文件系統(tǒng)接口原語(yǔ)、設(shè)備相關(guān)終端控制函數(shù)以及進(jìn)程控制函數(shù)。

BerkeleyUnix

SVID:SystemV接口描述。GNUC函數(shù)庫(kù)定義了大多數(shù)由SVID指定而未被ISOC和POSIX標(biāo)準(zhǔn)指定函數(shù)。來(lái)自SystemV支持函數(shù)包含進(jìn)程間通信和共享內(nèi)存、hsearch和drand48函數(shù)族、fmtmsg以及一些數(shù)學(xué)函數(shù)。

XPG:X/Open可移植性指南。GNUC函數(shù)庫(kù)遵照X/Open可移植性指南(Issue4.2)

以及全部XSI(X/Open系統(tǒng)接口)兼容系統(tǒng)擴(kuò)展,同時(shí)也遵照全部X/OpenUnix擴(kuò)展。

第68頁(yè)系統(tǒng)調(diào)用 系統(tǒng)調(diào)用是操作系統(tǒng)提供給外部程序接口。在C語(yǔ)言中,操作系統(tǒng)系統(tǒng)調(diào)用通常經(jīng)過(guò)函數(shù)調(diào)用形式完成,這是因?yàn)檫@些函數(shù)封裝了系統(tǒng)調(diào)用細(xì)節(jié),將系統(tǒng)調(diào)用入口、參數(shù)以及返回值用C語(yǔ)言函數(shù)調(diào)用過(guò)程實(shí)現(xiàn)。在Linux系統(tǒng)中,系統(tǒng)調(diào)用函數(shù)定義在glibc中。談到系統(tǒng)調(diào)用時(shí),需要注意以下幾點(diǎn):系統(tǒng)調(diào)用函數(shù)通常(fork除外)在成功時(shí)返回0值,不成功時(shí)返回非零值。假如要檢驗(yàn)失敗原因,則要判斷errno這個(gè)全局變量值,errno中包含有錯(cuò)誤代碼。

許多系統(tǒng)調(diào)用返回?cái)?shù)據(jù)通常經(jīng)過(guò)引用參數(shù)傳遞。這時(shí),需要在函數(shù)參數(shù)中傳遞一個(gè)緩沖區(qū)地址,而返回?cái)?shù)據(jù)就保留在該緩沖區(qū)中。

不能認(rèn)為系統(tǒng)調(diào)用函數(shù)就要比其它函數(shù)執(zhí)行效率高。要注意,系統(tǒng)調(diào)用是一個(gè)非常耗時(shí)過(guò)程。

第69頁(yè)LINUX中庫(kù)文件和頭文件頭文件/usr/include:系統(tǒng)頭文件

/usr/local/include:當(dāng)?shù)仡^文件函數(shù)庫(kù)/lib:系統(tǒng)必備共享庫(kù)

/usr/lib:標(biāo)準(zhǔn)共享庫(kù)和靜態(tài)庫(kù)

/usr/X11R6/lib:X11R6函數(shù)庫(kù)

/usr/local/lib:當(dāng)?shù)睾瘮?shù)庫(kù)

共享庫(kù)及其相關(guān)配置/etc/ld.so.conf:包含共享庫(kù)搜索位置

ldconfig:共享庫(kù)管理工具,普通在更新了共享庫(kù)之后要運(yùn)行該命令

ldd:可查看可執(zhí)行文件所使用共享庫(kù)

第70頁(yè)語(yǔ)言編程格調(diào)

C語(yǔ)言最初來(lái)自UNIX操作系統(tǒng),與UNIX設(shè)計(jì)標(biāo)準(zhǔn)一樣,C語(yǔ)言被廣泛認(rèn)可和使用一個(gè)主要原因是它靈活性以及簡(jiǎn)練性。所以,在利用C語(yǔ)言編寫程序時(shí),一直應(yīng)該符合其簡(jiǎn)練設(shè)計(jì)標(biāo)準(zhǔn),而不應(yīng)該使用非常復(fù)雜變量命名方法。Linus為L(zhǎng)inux內(nèi)核定義C語(yǔ)言編碼格調(diào)關(guān)鍵點(diǎn)以下(一樣適合用于普通用戶程序):

縮進(jìn)時(shí),使用長(zhǎng)度為8個(gè)字符寬Tab鍵。假如程序縮進(jìn)超出3級(jí),則應(yīng)考慮重新設(shè)計(jì)程序。

大括號(hào)位置。除函數(shù)定義體外,應(yīng)該將左大括號(hào)放在行尾,而將右大括號(hào)放在行首。函數(shù)定義體應(yīng)將左右大括號(hào)放在行首。應(yīng)采取簡(jiǎn)練命名方法。對(duì)變量名,不贊成使用大小寫混寫形式,但勉勵(lì)使用描述性名稱;盡可能不使用全局變量;不采取匈牙利命名法表示變量類型;采取短小精悍名稱表示局部變量;防止使用過(guò)多局部變量。

保持函數(shù)短小精悍。不應(yīng)過(guò)分強(qiáng)調(diào)注釋作用,應(yīng)盡可能采取好編碼格調(diào)而不是添加過(guò)多注釋。

第71頁(yè)LINUX對(duì)目標(biāo)代碼格式支持 Linux支持各種類型可執(zhí)行文件格式,如a.out、COFF、ELF、JAVA等。LINUX目標(biāo)代碼以兩種形式存在:靜態(tài)和動(dòng)態(tài),在gcc編譯選項(xiàng)中經(jīng)過(guò)“-static”或“–shared”來(lái)標(biāo)識(shí)。比較內(nèi)容靜態(tài)格式動(dòng)態(tài)格式代碼長(zhǎng)度較長(zhǎng),需要更多磁盤空間短執(zhí)行影響無(wú)須調(diào)入動(dòng)態(tài)庫(kù)裝入需要?jiǎng)討B(tài)庫(kù)裝入程序,執(zhí)行中占用更多資源和時(shí)間靈活性代碼固定裝配好,不方便修改能夠經(jīng)過(guò)動(dòng)態(tài)庫(kù)修改進(jìn)行代碼在線升級(jí)安全性難以在目標(biāo)代碼插入其它程序能夠經(jīng)過(guò)更改動(dòng)態(tài)庫(kù)插入其它代碼第72頁(yè)LINUX對(duì)各種目標(biāo)代碼格式支持

LINUX允許可執(zhí)行文件能夠有許多格式,甚至是一個(gè)腳本文件。腳本文件需要恰當(dāng)命令解釋器來(lái)處理它們;比如/bin/sh解釋shell腳本??蓤?zhí)行目標(biāo)文件包含可執(zhí)行代碼和數(shù)據(jù),這么操作系統(tǒng)能夠取得足夠信息將其加載到內(nèi)存并執(zhí)行之。Linux最慣用目標(biāo)文件是ELF,不過(guò)理論上Linux能夠靈活地處理幾乎全部目標(biāo)文件格式。已注冊(cè)二進(jìn)制格式

經(jīng)過(guò)使用文件系統(tǒng),Linux所支持二進(jìn)制格式既能夠結(jié)構(gòu)到關(guān)鍵又能夠作為模塊加載。關(guān)鍵保留著一個(gè)能夠支持二進(jìn)制格式鏈表(見上圖),同時(shí)當(dāng)執(zhí)行一個(gè)文件時(shí),各種二進(jìn)制格式被依次嘗試。

第73頁(yè)LINUX下不一樣目標(biāo)文件格式a.out格式:“最古典”UNIX目標(biāo)碼格式.它使用一個(gè)簡(jiǎn)短文件頭,而且在開始地方有一個(gè)magicnumber.主要它包含三個(gè)區(qū)塊:.text,.data及.bss再加上一個(gè)符號(hào)表及一個(gè)字串表.FreeBSD使用a.out格式COFF目標(biāo)文件格式:SVR3目標(biāo)碼格式.header是由一個(gè)區(qū)塊表所組成,你能夠有比.text,.data,及.bss更多區(qū)塊,包含:.sdata,.sbss,.init,.fini,.rconst等。SVR3、Tru64UNIX采取此格式。

——參考正文圖2.7第74頁(yè)LINUX目標(biāo)文件格式ELF(ExecutableandlinkingFormat)是

COFF

替換者,是UNIX系統(tǒng)試驗(yàn)室(USL)開發(fā)和公布二進(jìn)制格式。ELF與其它目標(biāo)文件格式相比,特點(diǎn)是多個(gè)區(qū)塊及2^32或2^64可能容量,比a.out和COFF更強(qiáng)大更靈活。主要缺點(diǎn)是:與COFF和a.out相比,ELF開銷稍大。在LINUX、SVR4、SCO和Solaris2.x上,ELF都作為可執(zhí)行文件默認(rèn)二進(jìn)制格式。ELF可執(zhí)行文件中包含可執(zhí)行代碼,即正文段:text和數(shù)據(jù)段:data。位于可執(zhí)行映象中表描敘了程序應(yīng)怎樣放入進(jìn)程虛擬地址空間中。靜態(tài)連接映象是經(jīng)過(guò)連接器ld得到,在單個(gè)映象中包含全部運(yùn)行此映象所需代碼和數(shù)據(jù)。

此映象同時(shí)也定義了映象內(nèi)存分布和首先被執(zhí)行代碼地址。

第75頁(yè)ELF目標(biāo)代碼三種存在形式ELF文件有三種主要類型:可執(zhí)行文件 包含了代碼和數(shù)據(jù)。含有可執(zhí)行程序。

可重定位文件

包含了代碼和數(shù)據(jù)(這些數(shù)據(jù)是和其它重定位文件和共享

object文件一起連接時(shí)使用),主要是哪些能夠用于連接目標(biāo)碼

共享object文件(又可叫做共享庫(kù)) 包含了代碼和數(shù)據(jù)(這些數(shù)據(jù)是在連接時(shí)候被連接器ld和運(yùn)行時(shí)動(dòng)態(tài)連接器使用)。動(dòng)態(tài)連接器可能稱為

ld.so.1,libc.so.1或者ld-linux.so.1。

第76頁(yè)目標(biāo)代碼幻數(shù)LINUX頭文件a.out.h中定義了目標(biāo)文件幻數(shù):#defineOMAGIC0407 /*Codeindicatingobjectfileor impureexecutable.正文數(shù)據(jù)合一*/#defineNMAGIC0410 /*Codeindicatingpure executable.共享正文*/#defineZMAGIC0413 /*Codeindicatingdemand- pagedexecutable.*/#defineQMAGIC0314 /*Thisindicatesademanddexecutablewiththeheaderinthetext.ThefirstpageisunmappedtohelptrapNULLpointerreferences*/#defineCMAGIC0421 /*Codeindicatingcorefile.*/

第77頁(yè)一個(gè)ELF映象文件分析 這是一個(gè)打印“HelloWorld”并退出簡(jiǎn)單C程序,文件頭將其作為一個(gè)帶兩個(gè)物理文件頭(e_phnum=2)ELF映象來(lái)描敘,物理文件頭位于映象文件起始位置52字節(jié)處。 第一個(gè)物理文件頭描敘是映象中可執(zhí)行代碼。它從虛擬地址0x8048000開始,長(zhǎng)度為65532字節(jié)。映象入口點(diǎn),即程序第一條指令,不是位于映象起始位置而在虛擬地址0x8048090(e_entry)處。 代碼恰好接著第二個(gè)物理文件頭。這個(gè)物理文件頭描敘了此程序使用數(shù)據(jù),它被加載到虛擬內(nèi)存中0x8059BB8處。這些數(shù)據(jù)是可讀并可寫。第78頁(yè)ELF目標(biāo)格式sectionELF每個(gè)可執(zhí)行文件或者是共享object文件普通包含一個(gè)sectiontable,該表是描述ELF文件里sections結(jié)構(gòu)數(shù)組。下面說(shuō)明了在ELF中定義幾個(gè)主要sections。.text:正文段.rodata:只讀數(shù)據(jù)段.sdata:small數(shù)據(jù)段.data:數(shù)據(jù)段.sbss:small未初始化數(shù)據(jù)段.bss:未初始化數(shù)據(jù)段.fini:該section保留著進(jìn)程終止代碼指令。所以,當(dāng)一個(gè)程序正常退出時(shí),系統(tǒng)安排執(zhí)行這個(gè)section中代碼。.init:該section保留著可執(zhí)行指令,它組成了進(jìn)程初始化代碼。當(dāng)一個(gè)程序開始運(yùn)行時(shí),在main函數(shù)被調(diào)用之前(c語(yǔ)言稱為

main),系統(tǒng)安排執(zhí)行這個(gè)section中代碼。 .init和.finisections存在有著尤其目標(biāo)。假如一個(gè)函數(shù)放到.initsection,在main函數(shù)執(zhí)行前系統(tǒng)就會(huì)執(zhí)行它。同理,假如一個(gè)函數(shù)放到.finisection,在main函數(shù)返回后該函數(shù)就會(huì)執(zhí)行。該特征被C++編譯器使用,完成全局結(jié)構(gòu)和析構(gòu)函數(shù)功效。

.ctors:

該section保留著程序全局結(jié)構(gòu)函數(shù)指針數(shù)組。.dtors:該section保留著程序全局析構(gòu)函數(shù)指針數(shù)組。

第79頁(yè)與目標(biāo)碼相關(guān)幾個(gè)主要命令LINUXBinutils軟件包包含以下工具程序: gasp,gprof,ld,as,ar,nm,objcopy,objdump,ranlib,readelf,size,strings,strip,c++filt及addr2line。本文僅介紹:ObjcopyObjdumpNmReadelf——參考正文第80頁(yè)本章小結(jié) 本章是用戶編程一個(gè)基礎(chǔ),我們從介紹GNUC開始,逐步深入了解了GNUmake一些內(nèi)容;經(jīng)過(guò)對(duì)庫(kù)、頭文件、系統(tǒng)調(diào)用及程序設(shè)計(jì)編碼格調(diào)學(xué)習(xí),逐步結(jié)構(gòu)了一個(gè)用戶程序輪廓。 最終,我們介紹了LINUX支持目標(biāo)代碼及其布局,有利于我們系統(tǒng)地了解程序執(zhí)行和解析過(guò)程。第81頁(yè)第三章LINUX進(jìn)程環(huán)境

及空間管理

第82頁(yè)進(jìn)程基本環(huán)境Main及命令行參數(shù)

intmain(intargc,char*argv[]);

進(jìn)程終止五種方式(1)正常終止:(a)從main返回。(b)調(diào)用exit。(c)調(diào)用_exit。(2)異常終止:(a)調(diào)用abort。(b)由一個(gè)信號(hào)終止。

第83頁(yè)程序環(huán)境變量每個(gè)程序都有一張環(huán)境表。與參數(shù)表一樣,環(huán)境表也是一個(gè)字符指針數(shù)組,其中每個(gè)指針包含一個(gè)以null結(jié)束字符串地址。全局變量environ則包含了該指針數(shù)組地址。 externchar**environ;

第84頁(yè)程序環(huán)境變量在歷史上,大多數(shù)UNIX系統(tǒng)對(duì)main函數(shù)提供了第三個(gè)參數(shù),它就是環(huán)境表地址:intmain(intargc,char*argv[],

char*envp[]

);ANSIC要求main函數(shù)只有兩個(gè)參數(shù),而且第三個(gè)參數(shù)與全局變量environ相比也沒有帶來(lái)更多益處,所以POSIX.1也要求應(yīng)使用environ而不使用第三個(gè)參數(shù)。通慣用getenv和putenv函數(shù)來(lái)存取特定環(huán)境變量,而不是用environ變量。假如要查看整個(gè)環(huán)境,則必須使用environ指針。第85頁(yè)常見環(huán)境變量第86頁(yè)環(huán)境變量形成和傳遞過(guò)程Shell傳遞方式用戶程序環(huán)境變量存放示例

——參考正文3.1.5第87頁(yè)環(huán)境相關(guān)操作函數(shù)getenvputenvsetenvunsetenvclearenv ——參考正文3.2.1第88頁(yè)C程序空間布局

目標(biāo)代碼幻數(shù)不一樣,形成程序空間也存在差異,普通情況下包含:正文段初始化數(shù)據(jù)段BSS段,未初始化數(shù)據(jù)段(blockstartedbysymbol(由符號(hào)開始?jí)K)

棧段堆第89頁(yè)動(dòng)態(tài)存放空間分配——堆空間分配

ANSIC說(shuō)明了三個(gè)用于存放空間動(dòng)態(tài)分配函數(shù)。(1)malloc。分配指定字節(jié)數(shù)存放區(qū)。此存放區(qū)中初始值不確定。(2)calloc。為指定長(zhǎng)度對(duì)象,分配能容納其指定個(gè)數(shù)存放空間。該空間中每一位(bit)都初始化為0。(3)realloc。更改以前分配區(qū)長(zhǎng)度(增加或降低)。當(dāng)增加長(zhǎng)度時(shí),可能需將以前分配區(qū)內(nèi)容移到另一個(gè)足夠大區(qū)域,而新增區(qū)域內(nèi)初始值則不確定。

——詳細(xì)說(shuō)明參考正文3.4.1第90頁(yè)堆空間分配說(shuō)明malloc和free基于Kernighan和Ritchie[1988]算法。大多數(shù)實(shí)現(xiàn)所分配存放空間比所要求要稍大一些(有對(duì)界要求),額外空間用來(lái)統(tǒng)計(jì)管理信息——分配塊長(zhǎng)度,指向下一個(gè)分配塊指針等等。即使sbrk能夠擴(kuò)充或縮小一個(gè)進(jìn)程存放空間,不過(guò)大多數(shù)malloc和free實(shí)現(xiàn)都不減小進(jìn)程存放空間。釋放空間可供以后再分配,但將它們保持在malloc池中而不返回給內(nèi)核。

使用注意事項(xiàng)假如寫過(guò)一個(gè)已分配區(qū)尾端,則會(huì)改寫后一塊管理信息。這種類型錯(cuò)誤是災(zāi)難性,不過(guò)因?yàn)檫@種錯(cuò)誤不會(huì)很快就暴露出來(lái),所以也就極難發(fā)覺。將指向分配塊指針向后移動(dòng)也可能會(huì)改寫本塊管理信息。預(yù)防釋放一個(gè)已經(jīng)釋放了塊;調(diào)用free時(shí)所用指針要確保是三個(gè)alloc函數(shù)返回值(在使用指針時(shí)要尤其注意)

第91頁(yè)空間分配系統(tǒng)調(diào)用brkmmapmunmap ——參考正文3.4.2第92頁(yè)mmap實(shí)現(xiàn)共享空間訪問(wèn)兩種方式使用普通文件提供內(nèi)存映射:適合用于任何進(jìn)程之間;此時(shí),需要打開或創(chuàng)建一個(gè)文件,然后再調(diào)用mmap();經(jīng)典調(diào)用代碼以下:fd=open(name,flag,mode);if(fd<0)...

ptr=mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);

該接口使得進(jìn)程之間經(jīng)過(guò)映射同一個(gè)普通文件實(shí)現(xiàn)共享內(nèi)存。普通文件被映射到進(jìn)程地址空間后,進(jìn)程能夠向訪問(wèn)普通內(nèi)存一樣對(duì)文件進(jìn)行訪問(wèn),無(wú)須再調(diào)用read(),write()等操作。

第93頁(yè)mmap實(shí)現(xiàn)共享空間訪問(wèn)兩種方式2) 使用特殊文件提供匿名內(nèi)存映射

mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);

適合用于含有親緣關(guān)系進(jìn)程之間;因?yàn)楦缸舆M(jìn)程特殊親緣關(guān)系,在父進(jìn)程中先調(diào)用mmap(),然后調(diào)用fork()。 那么在調(diào)用fork()之后,子進(jìn)程繼承父進(jìn)程匿名映射后地址空間,一樣也繼承mmap()返回地址,這么,父子進(jìn)程就能夠經(jīng)過(guò)映射區(qū)域進(jìn)行通信了。 注意,這里不是普通繼承關(guān)系。普通來(lái)說(shuō),子進(jìn)程單獨(dú)維護(hù)從父進(jìn)程繼承下來(lái)一些變量。而mmap()返回地址,卻由父子進(jìn)程共同維護(hù)。對(duì)于含有親緣關(guān)系進(jìn)程實(shí)現(xiàn)共享內(nèi)存最好方式應(yīng)該是采取匿名內(nèi)存映射方式。此時(shí),無(wú)須指定詳細(xì)文件,只要設(shè)置對(duì)應(yīng)標(biāo)志即可。

第94頁(yè)mmap實(shí)現(xiàn)共享空間訪問(wèn)實(shí)例

——正文3.4.3第95頁(yè)空間屬性操作接口getpagesize-取得內(nèi)存分頁(yè)大小

mlock-鎖定進(jìn)程地址空間

munlock-解除鎖定進(jìn)程地址空間

munlockall-解除全部鎖定進(jìn)程地址空間mprotect-設(shè)置新存放空間訪問(wèn)特征

——接口和示例參考正文3.4.4第96頁(yè)setjmp和longjmp函數(shù)在C中,不允許使用跳越函數(shù)goto語(yǔ)句。而執(zhí)行這種跳轉(zhuǎn)功效是函數(shù)setjmp和longjmp,這兩個(gè)函數(shù)對(duì)于處剪發(fā)生在很深嵌套函數(shù)調(diào)用中犯錯(cuò)情況非常有用。Setjmp:保留當(dāng)前執(zhí)行進(jìn)程上下文Longjmp:恢復(fù)到保留進(jìn)程上下文執(zhí)行進(jìn)程上下文信息包含:定點(diǎn)存放器、浮點(diǎn)存放器、信號(hào)屏蔽、PC、棧地址等

正確了解用longjmp恢復(fù)上下文執(zhí)行時(shí)棧、存放器和易失變量語(yǔ)義

——參考正文示例

3.7第97頁(yè)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論