本節書摘來自異步社群《linux 進階程式設計(第三版)》一書中的第1章,第1.1節,作者:楊宗德 , 呂光宏 , 劉雍著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視
linux應用程式開發平台有别于windows應用程式開發平台,是以在介紹具體程式設計内容之前,本書第1、2章主要介紹linux作業系統下c語言程式的開發環境和開發工具。
本章主要介紹linux下c語言開發環境,包括一些基本概念和基本程式設計環境。本章第1節主要對linux作業系統及其相關術語進行了簡要介紹。
本章第2節主要介紹linux作業系統下程式設計基本概念以及如何獲得linux下的幫助檔案,包括linux作業系統下c語言庫檔案标準以及系統調用的基本概念。
本章第3節主要介紹linux部分常用工具,包括檔案打包工具、查找搜尋工具,熟練使用這些指令或工具在程式設計時能夠很好地提高效率。
本章第4節為讀者展示了gnu編碼規範和linux核心編碼規範。讀者在學習linux程式設計之前應養成良好的編碼規範,這樣不僅能增強代碼的可讀性,還能減少代碼維護的工作量,提高代碼的可擴充性。
linux 進階程式設計(第三版)
1.1.1 linux作業系統簡介
unix作業系統于1969年由ken thompson在at& t貝爾實驗室的一台dec pdp-7計算機上實作。後來ken thompson和dennis ritchie使用c語言對整個系統進行了再加工和編寫,使得unix能夠很容易地移植到其他硬體的計算機上。由于此時at&t還沒有把unix作為它的正式商品,是以研究人員隻是在實驗室内部使用并完善它。正是由于unix是被作為研究項目,其他科研機構和大學的計算機研究人員也希望能得到這個系統,以便進行自己的研究。at&t采用分發許可證的方法,大學和研究機構僅僅需要很少的費用就能獲得unix的源代碼以進行研究。unix的源代碼被散發到各個大學,一方面使得科研人員能夠根據需要改進系統,或者将其移植到其他的硬體環境中去;另一方面培養了大量懂得unix使用和程式設計的學生,這使unix的使用更為普及。
到了20世紀70年代末,在unix發展到版本6之後,at&t認識到了unix的價值,并成立了unix系統實驗室(unix system lab,usl)來繼續發展unix。是以一方面at&t繼續發展内部使用的unix版本7,一方面由usl開發對外正式發行的unix版本,同時at&t也宣布對unix産品擁有所有權。幾乎在同時,加州大學伯克利分校計算機系統研究小組(csrg)借助unix對作業系統進行了研究,他們對unix進行的改進相當多,增加了很多當時非常先進的特性,包括更好的記憶體管理、快速且健壯的檔案系統等,大部分原有的源代碼都被重寫,很多其他的unix使用者,包括其他大學和商業機構,都希望能得到經csrg改進的unix系統。是以csrg的研究人員把他們的unix組成一個完整的unix系統──bsd unix(berkeley software distribution)向外發行。
與此同時,at&t的unix系統實驗室也在不斷改進他們的商用unix版本,直到他們吸收了bsd unix中已有的各種先進特性,并結合其本身的特點,推出了unix system v版本。從此以後,bsd unix和unix system v形成了當今unix的兩大主流,現代的unix版本大部分都是這兩個版本的衍生産品:ibm的aix4.0、hp/ux11和sco的unixware等屬于system v,而minix、freebsd、netbsd、openbsd等屬于bsd unix。
linux由unix作業系統發展而來,它的核心由linus torvalds以及網絡上組織松散的黑客隊伍一起從零開始編寫而成。linux從一開始就決定自由擴散linux(包括源代碼),他把源代碼釋出在網上,随即就引起愛好者的注意,他們通過網際網路也加入了linux的核心開發工作。一大批高水準程式員的加入使linux得到了迅猛發展。到1993年底,linux 1.0終于誕生。linux 1.0已經是一個功能完備的作業系統,其核心緊湊高效,可以充分發揮硬體的性能,在4mb記憶體的80386機器上也表現得非常好。
linux加入gnu并遵循通用公共許可證(gpl),由于不排斥商家對自由軟體進一步開發,故而使linux開始了又一次飛躍,出現了很多linux發行版,如ubutu、slackware、redhat、turbolinux、openlinux等十多種,而且還在增加;還有一些公司在linux上開發商業軟體或把其他unix平台的軟體移植到linux上來。如今很多it界的大腕如ibm、intel、oracle、infomix、sysbase、netscape、novell等都宣布支援linux。商家的加盟彌補了純自由軟體的不足,掃清了發展障礙,linux得以迅速普及。
linux作業系統具有以下特點。
linux具備現代一切功能完整的unix系統所具備的全部特征,其中包括真正的多任務、虛拟記憶體、共享庫、需求裝載、優秀的記憶體管理以及tcp/ip網絡支援等。
linux的發行遵守gnu的通用公共許可證(gpl)。
在原代碼級上相容絕大部分的unix标準(如ieee posix,system v,bsd),遵從posix規範。讀者可以在網絡上獲得關于這一内容的更多資訊。
1.1.2 gnu/linux簡介
gnu工程(gnu是“gnu's not unix”首字母縮寫語)開始于1984年,旨在發展一款類unix且為自由軟體的完整作業系統:gnu系統。更精确地說,各種使用linux作為核心的gnu作業系統應該被稱為gnu/linux系統。
gnu工程開發了大量用于unix的自由軟體工具和類unix作業系統,例如linux。雖然有許多組織和個人都對linux的發展作出了幫助,但自由軟體基金會依然是最大的單個貢獻者。它不僅僅創造了絕大部分在linux中使用的工具,還為linux的存在提供了理論和社會基礎。
為保證gnu軟體可以自由地“使用、複制、修改和釋出”,所有gnu軟體都遵循無條件授權所有權利給任何人的協定條款─gnu通用公共許可證(gnu general public license,gpl)。
1985年richard stallman創立的自由軟體基金會(fsf,free software foundation)為gnu計劃提供了技術、法律以及财政支援。盡管gnu計劃大部分時候是由個人自願無償貢獻,但fsf有時還是會聘請程式員幫助編寫。當gnu計劃開始逐漸獲得成功時,一些商業公司開始介入開發和技術支援。
到了1990年,gnu計劃已經開發出的軟體包括了一個功能強大的文字編輯器emacs、c語言編譯器gcc以及大部分unix系統的程式庫和工具。唯一依然沒有完成的重要元件就是作業系統的核心(稱為hurd)。
1.1.3 相關術語介紹
1.posix及其重要地位
posix表示可移植作業系統接口(portable operating system interface,縮寫為posix是為了讀音更像unix)。它由電氣和電子工程師協會(institute of electrical and electronics engineers,簡稱為ieee)開發,可以提高類unix環境下應用程式的可移植性。然而,posix并不局限于unix,許多其他的作業系統,例如dec openvms和microsoft windows nt,都支援posix标準,尤其是ieee std.1003.1-1990(1995年修訂)和posix.1。posix.1給作業系統提供了源代碼級别的c語言應用程式設計接口(api),例如讀寫檔案read/write。posix.1已經被國際标準化組織(international standards organization,縮寫為iso)所接受,被命名為iso/iec9945-1:1990标準。雖然某些部分還處在開發過程中,但是posix現在已經發展成為一個龐大的标準族。
2.gnu和linux的關系
gnu項目已經開發了許多高品質的程式設計工具,包括emacs編輯器、著名的gnu c和c++編譯器(gcc和g++),這些編譯器可以在任何計算機系統上運作。所有的gnu軟體和派生工作均使用gnu通用公共許可證(gpl)。gpl允許軟體作者擁有軟體版權,但要授予其他任何人以合法複制、發行和修改軟體的權利。
linux中使用了許多gnu工具,用于實作posix.2标準的工具幾乎都是gnu項目開發的。linux核心、gnu工具以及其他的一些自由軟體組成了人們常說的linux,包括c語言編譯器和其他開發工具及函數庫、x window視窗系統、各種應用軟體(包括字處理軟體、圖像處理軟體等)、其他各種internet軟體(包括ftp伺服器、www伺服器)、關系資料庫管理系統等。
3.通用公共許可證(general public license,gpl)
gpl的文本儲存在linux系統的不同目錄中的copying檔案裡。例如,鍵入“cd/usr/ doc/ghostscript*”,然後再鍵入“more copying”可檢視gpl的内容。gpl和軟體是否免費無關,它的主要目标是保證軟體對所有使用者來說是自由的。gpl通過如下途徑實作這一目标。
(1)要求軟體以源代碼的形式釋出,并規定任何使用者都能夠以源代碼的形式将軟體複制或釋出給其他使用者。
(2)提醒每個使用者,對于該軟體不提供任何形式的擔保。
(3)如果使用者的軟體使用了受gpl保護的軟體的任何一部分,該軟體都會成為gpl軟體,也就是說必須随應用程式一起釋出源代碼。
(4)gpl并不排斥對自由軟體進行商業性質的包裝和發行,也不限制在自由軟體的基礎上打包發行其他非自由軟體。
遵照gpl的軟體并不是可以任意傳播的,這些軟體通常都有正式的版權,gpl在釋出軟體或者複制軟體時都會聲明限制條件。但是,從使用者的角度考慮,這些根本不能算是限制條件,相反,使用者隻會從中受益,因為它可以確定使用者獲得源代碼。
盡管linux核心也屬于gpl範疇,但gpl并不适用于通過系統調用而使用核心服務的應用程式,通常把這種應用程式看作是核心的正常使用。假如準備以二進制的形式釋出應用程式(像大多數商業軟體那樣),則必須確定自己的程式未使用gpl保護的任何軟體。如果軟體通過庫函數調用而且使用了其他軟體,則不必受此限制。大多數函數庫受另一種gnu公共許可證,即lgpl的保護,下面将會介紹。
4.lgpl(libraray general public license)
gnu lgpl(gnu程式庫通用公共許可證)的内容包括在copying.lib檔案中。如果安裝了核心源程式,在任意一個源程式的目錄下都可以找到copying.lib檔案的一個複制。
lgpl允許在自己的應用程式中使用程式庫,即使不公開自己的源代碼。但是,lgpl還規定,使用者必須能夠獲得在應用程式中使用的程式庫的源代碼,并且允許使用者對這些程式庫進行修改。
大多數linux程式庫,包括c程式庫(libc.a)都屬于lgpl範疇。是以,如果在linux環境下,使用gcc編譯器建立自己的應用程式,程式所連接配接的多數程式庫是受lgpl保護的。如果想以二進制的形式釋出自己的應用程式,則必須注意遵循lgpl有關規定。
遵循lgpl的一種方法是,随應用程式一起釋出目标代碼,并釋出這些目标程式和受lgpl保護的、更新的linux程式庫連接配接起來的makefile檔案。
遵循lgpl的另一種方法是使用動态連接配接。使用動态連接配接時,即使程式在運作中調用函數庫中的函數,應用程式本身和函數庫也是不同的實體。通過動态連接配接,使用者可以直接使用更新後的函數庫,而不用對應用程式重新連接配接。