Note1:APUE引言
一、UNIX/Linux前世今生
UNIX來源
20世紀(jì)60年代是大型、復(fù)雜操作系統(tǒng)盛行的年代,比如IBM的OS/360和Honeywell的Multics系統(tǒng)。OS/360是歷史上最成功的軟件項(xiàng)目之一,而 Multics雖然持續(xù)存在了多年,卻從來沒有被廣泛應(yīng)用過。貝爾實(shí)驗(yàn)室曾經(jīng)是Multics項(xiàng)目的最初參與者,但是因?yàn)榭紤]到該項(xiàng)目的復(fù)雜性和缺乏進(jìn)展而于1969年退出。鑒于Mutics項(xiàng)目不愉快的經(jīng)歷, Bell實(shí)驗(yàn)室的?Ken Thompson?開始利用一臺(tái)閑置的 PDP-7計(jì)算機(jī)開發(fā)了一種多用戶,多任務(wù)操作系統(tǒng)。很快,Dennis Richie?加入了這個(gè)項(xiàng)目,在他們共同努力下誕生了最早的UNIX。Richie?受一個(gè)更早的項(xiàng)目——MULTICS的啟發(fā),將此操作系統(tǒng)命名為 Unix。早期UNIX是用匯編語言編寫的,但其第三個(gè)版本用一種嶄新的編程語言C重新設(shè)計(jì)了。C是?Richie?設(shè)計(jì)出來并用于編寫操作系統(tǒng)的程序語言。通過這次重新編 寫,Unix得以移植到更為強(qiáng)大的 DEC PDP-11/45與11/70計(jì)算機(jī)上運(yùn)行。后來發(fā)生的一切,正如他們所說,已經(jīng)成為歷史。 Unix從實(shí)驗(yàn)室走出來并成為了操作系統(tǒng)的主流,現(xiàn)在幾乎每個(gè)主要的計(jì)算機(jī)廠商都有其自有版本的Unix。
POSIX來源
20世紀(jì)80年代中期,隨著UNIX成長后來占領(lǐng)了市場,公司多了,懂得人也多了,就分家了。Unix廠商試圖通過加入新的、往往不兼容的特性來使它們的程序與眾不同,麻煩也就隨之而來了。為了阻止這種趨勢,IEEE(電氣和電子工程師協(xié)會(huì))開始努力標(biāo)準(zhǔn)化Unix的開發(fā),后來由 Richard Stallman?命名為“POSIX(Portable Operating System Interface of UNIX)”。結(jié)果就得到 了一系列的標(biāo)準(zhǔn),稱作Posix標(biāo)準(zhǔn)。這套標(biāo)準(zhǔn)涵蓋了很多方面,比如Unix系統(tǒng)調(diào)用的C語言接口、shell程序和工具、線程及網(wǎng)絡(luò)編程。“UNIX”這個(gè)名字由于法律關(guān)系,誰也不能說自己的操作系統(tǒng)是“UNIX”而只能說是“UNIX兼容”系統(tǒng)了。所以現(xiàn) 在“UNIX”系統(tǒng)嚴(yán)格意義上說是不存在的,存在的只是一個(gè)遙遠(yuǎn)的傳說。那么現(xiàn)在那些Solaris,AIX,IRIS,macOS都是什么呢?那些都是各公司在他們硬件平提上作的商業(yè)UNIX,這些系統(tǒng)都遵循POSIX標(biāo)準(zhǔn)。
GNU來源
GNU就是GNU's Not Unix的縮寫, GNU 的創(chuàng)始人Stallman認(rèn)為UNIX雖然不是最好的操作系統(tǒng),但是至少不會(huì)太差,而他自信有能力把UNIX 不足的地方加以改進(jìn),使它成為一個(gè)優(yōu)良的操作系統(tǒng),就是名為GNU的一個(gè)同UNIX兼容的操作系統(tǒng),并且開發(fā)這 個(gè)系統(tǒng)的目的就是為了讓所有計(jì)算機(jī)用戶都可以自由地獲得這個(gè)系統(tǒng)。任何人都可以免費(fèi)地獲得這個(gè)系統(tǒng)的源代碼,并且可以相互自由拷貝GNU 是由自由軟件基金會(huì) (Free Software Foundation,FSF)的董事長Richard M. Stallman (RMS)于1984年發(fā)起的,如今已經(jīng)有十幾年的歷史了。
GNU 開始的策略就是先開發(fā)UNIX已經(jīng)有的程序(因?yàn)橛?jì)劃中GNU將會(huì)是一個(gè)與UNIX兼容的操作系統(tǒng),而UNIX下的標(biāo)準(zhǔn)使用界面已經(jīng)非常完善了,所以先依照這個(gè)標(biāo)準(zhǔn)開發(fā)應(yīng)用程序,將來GNU自己的系統(tǒng)核心一出來,就立即可以使用所有先前開發(fā)的 GNU 應(yīng)用程序),因此會(huì)先有emacs,GCC等工具軟件開發(fā)出來。其中GCC更是GNU計(jì)劃自立更生的一個(gè)重要步驟(不需要依 靠商業(yè)軟件來產(chǎn)生/編譯整個(gè)GNU系統(tǒng)),如今這套程序開發(fā)工具已經(jīng)很成熟了。下一步要做的就是開發(fā)GNU的核心--Hurd 了,只要Hurd一開發(fā)出來,GNU 就是一套能夠自我開機(jī),真正自給自足,完整的自由操作系統(tǒng)。
Hurd是基于Mach這個(gè)微內(nèi)核(micro kernel)上的操作系統(tǒng)核心。以后會(huì)使用尤他大學(xué)的Mach4(一個(gè)更為方便和快速的微內(nèi)核),由于Hurd基于Mach,所以只要Mach移植到什么機(jī)器上,Hurd也立刻就是這種硬件平臺(tái)的操作系統(tǒng),就這一點(diǎn)而言,它是一種很前衛(wèi)的操作系統(tǒng)。但是,GNU的操作系統(tǒng)核心Hurd一直處于實(shí)驗(yàn)階段,沒有任何可用性,實(shí)質(zhì)上也沒能開發(fā)出完整的GNU操作系統(tǒng),但是GNU奠定了Linux用戶基礎(chǔ)和開發(fā)環(huán)境。自由軟件基金會(huì)目前有一套以Linux為核心的GNU系統(tǒng)計(jì) 劃。這個(gè)計(jì)劃就是自由軟件基金會(huì)支持的 Debian Linux。 Debian Linux 是GNU軟件與公共軟件(Public Domain Software) 最徹底的結(jié)合,它是一套完全由GNU和公共軟件配置起來的,而且具有商業(yè)操作系統(tǒng)水平的操作系統(tǒng)。
Linux來源
Linux起源于一個(gè)學(xué)生的簡單需求。Linus Torvalds,Linux的作者與主要維護(hù)者,在其上大學(xué)時(shí)所買得起的唯一軟件是Minix。Minix是他的老師為講解操作系統(tǒng)原理這門課寫一個(gè)類似Unix操作系統(tǒng),它被廣泛用來輔助教學(xué)的簡單操作系統(tǒng)。Linus 對(duì)Minix 不是很滿意,于是決定自己編寫軟件。他以學(xué)生時(shí)代熟悉的Unix作為原型, 在一臺(tái)Intel 386 PC上開始了他的工作。他的進(jìn)展很 快,受工作成績的鼓舞,他將這項(xiàng)成果通過互連網(wǎng)與其他同學(xué)共享,主要用于學(xué)術(shù)領(lǐng)域。有人看到了這個(gè)軟件并開始分發(fā)。每當(dāng) 出現(xiàn)新問題時(shí),有人會(huì)立刻找到解決辦法并加入其中,很快的, Linux成為了一個(gè)操作系統(tǒng)。值得注意的是Linux并沒有包括 Unix源碼。它是按照公開的POSIX標(biāo)準(zhǔn)重新編寫的。Linux大量使用了由麻省劍橋免費(fèi)軟件基金的GNU軟件,同時(shí)Linux自身也 是用它們構(gòu)造而成。
?
二、站在十萬八千里的高度
在linux/unix的世界里,“萬般皆下品,一切皆文件!”這句話是linux/unix的哲學(xué)核心思想。從1991.10.5年?Linus Torvalds 在自己學(xué)校FTP站點(diǎn)上正式向外發(fā)布第一個(gè)穩(wěn)定的Linux內(nèi)核工作版本到今天,正是由于這種“簡單粗暴而又妖嬈”的設(shè)計(jì),才使得今天發(fā)生翻天覆地變化,我們在Linux/UNIX下編程時(shí)依然使用同一套API(Application Program Interface)。12年前的我剛開始接觸Linux編程時(shí)學(xué)習(xí)的是大神 Richard Stevens 所著的《UNIX高級(jí)環(huán)境編程,業(yè)界簡稱APUE》和《UNIX網(wǎng)絡(luò)編程,業(yè)界簡稱UNP》,12年后的今天,在帶大家學(xué)習(xí)Linux下編程時(shí)依然倍加推崇這兩本書。其中《APUE》是所有Linux下所有 程,序開發(fā)者的入門必備良藥,《UNP》是所有從事Linux網(wǎng)絡(luò)編程人員的必讀書籍。
從現(xiàn)在開始,我們就開始帶領(lǐng)大家走進(jìn)Linux下的編程世界,而這個(gè)窗戶就是《APUE》。在《APUE》這本書基本上覆蓋了 Linux下所有編程相關(guān)的知識(shí)點(diǎn),結(jié)合這么多年的嵌入式Linux開發(fā)經(jīng)驗(yàn),我把這本書需要重點(diǎn)掌握的內(nèi)容大致分為以下幾大塊:
- 文件I/O: open()、read()、write()、ioctl()、close()
- 多進(jìn)程編程: fork()、getpid()、getppid()、exec*()、system()、popen()
- 多線程編程: pthread_create()、pthread_join()、pthread_exit()
- 網(wǎng)絡(luò)編程: socket()、bind()、connect()、accept()、read()/recv()、write()/send()、close()
- 多路復(fù)用: select()、poll()、epoll()
- 進(jìn)程間通信(IPC): 管道(pipe)、命名管道(named pipe/FIFO)、消息隊(duì)列(Message Queue)、信號(hào)量(Semophore )、信 號(hào)(signal)、共享內(nèi)存(Shared Memory)、網(wǎng)絡(luò)通信(sockt和named socket)
?
三、系統(tǒng)調(diào)用與庫函數(shù)
Linux下對(duì)文件操作有兩種方式:系統(tǒng)調(diào)用(system call)和庫函數(shù)調(diào)用(Library functions)。在《APUE》這本書中講的絕大部分函數(shù)都是系統(tǒng)調(diào)用,而非庫函數(shù)。
系統(tǒng)調(diào)用
系統(tǒng)調(diào)用,我們可以理解是操作系統(tǒng)為用戶提供的一系列操作的接口(API),這些接口提供了對(duì)系統(tǒng)硬件設(shè)備功能的操作。可 以舉個(gè)例子,我們最熟悉的 hello world 程序會(huì)在屏幕上打印出信息,程序中調(diào)用了printf() 函數(shù),而庫函數(shù) printf 是將需要打印的信息輸出到屏幕這個(gè)硬件設(shè)備上。我們知道,對(duì)于所有硬件設(shè)備的操作都需要驅(qū)動(dòng)程序,而驅(qū)動(dòng)程序是由操作系統(tǒng)內(nèi)核實(shí)現(xiàn)的。這也就意味著我們的printf()函數(shù)最終需要調(diào)用Linux內(nèi)核的相關(guān)函數(shù)來操作屏幕這個(gè)設(shè)備,而這些函數(shù)就是系統(tǒng)調(diào)用。事實(shí)上,printf()庫函數(shù)的實(shí)現(xiàn)里最終會(huì)調(diào)用系統(tǒng)調(diào)用 write() 。
庫函數(shù)
庫函數(shù)可以理解為是對(duì)系統(tǒng)調(diào)用的一層封裝。系統(tǒng)調(diào)用作為內(nèi)核提供給用戶程序的接口,它的執(zhí)行效率是比較高效而精簡的, 但有時(shí)我們需要對(duì)獲取的信息進(jìn)行更復(fù)雜的處理,或更人性化的需要,我們把這些處理過程封裝成一個(gè)函數(shù)再提供給程序員,更方便于程序猿編碼。譬如在接下來的學(xué)習(xí)過程中,我們會(huì)學(xué)習(xí)read(int fd, char *buf, int size)這個(gè)系統(tǒng)調(diào)用,這個(gè)函數(shù)是從某個(gè)文件(由fd)標(biāo)志中,讀取最多不超過size個(gè)字節(jié)的數(shù)據(jù)并存放到buf中去,在這個(gè)系統(tǒng)調(diào)用中我們只能指定讀N個(gè)字節(jié)的數(shù)據(jù),而對(duì)于想一次讀取一行這樣的需求則可以調(diào)用庫函數(shù)fgets()來實(shí)現(xiàn),這在《C Primer Plus》的文件/IO中講到,當(dāng)然在《C Primer Plus》里提到的所有函數(shù)都是庫函數(shù)。
系統(tǒng)調(diào)用和庫函數(shù)
庫函數(shù)有可能包含有一個(gè)系統(tǒng)調(diào)用,有可能有好幾個(gè)系統(tǒng)調(diào)用,對(duì)于不需要涉及內(nèi)核的功能的庫函數(shù)也不需要調(diào)用系統(tǒng)調(diào)用, 比如strcpy()、strstr()、strlen()這些函數(shù)等。 對(duì)于一個(gè)功能,我們有時(shí)既可以使用系統(tǒng)調(diào)用來實(shí)現(xiàn),也可以使用庫函數(shù)來實(shí)現(xiàn),也沒有強(qiáng)制的規(guī)定,根據(jù)大家的實(shí)際需求來選擇。譬如對(duì)于文件的操作,我們可以使用open()、read()、write()、close()這些系統(tǒng) 調(diào)用實(shí)現(xiàn),當(dāng)然我們也可以使用fopen()、fread()、fwrite()、fgets()、fclose()這些庫函數(shù)來實(shí)現(xiàn),只有對(duì)比了解他們各自的特性我們針對(duì)不同的情況作出一個(gè)最優(yōu)的選擇。
總結(jié)
以上是生活随笔為你收集整理的Note1:APUE引言的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么修改CAD图纸中部分图块的颜色?
- 下一篇: 高速数据采集卡的机理分析