其實(shí)
Unix
很簡(jiǎn)單
陳皓
很多編程的朋友都在網(wǎng)上問(wèn)我這樣的幾個(gè)問(wèn)題, Unix 怎么學(xué)? Unix 怎么這么難?如何才能學(xué)好?并且讓我給他們一些學(xué)好 Unix 的經(jīng)驗(yàn)。在絕大多數(shù)時(shí)候,我發(fā)現(xiàn)問(wèn)這些問(wèn)題的朋友都有兩個(gè)特點(diǎn):
1 )對(duì) Unix 有畏難心理,對(duì)其沒(méi)有信心;
2 )喜歡用拿 Windows 來(lái)和 Unix 做比較。
這兩種特點(diǎn)就像兩個(gè)“心理暗示”,暗示著自己 Unix 很不好學(xué),暗示著 Unix 很糟糕,不如 Windows 好。于是,自己也就被自己的這種長(zhǎng)期的“暗示”所催眠了。因?yàn)椋瑥囊婚_始就有畏難情緒,所以也就覺(jué)得 Unix 不好,覺(jué)得非常很吃力,最后還會(huì)導(dǎo)致對(duì) Unix 的厭惡和反感的情緒。所以,為了糾正上述朋友們的“心理暗示”。我想寫下這篇文章, 想告訴大家, Unix 真的很簡(jiǎn)單。
在正式敘述“簡(jiǎn)單的 Unix ”之前,我想做幾點(diǎn)說(shuō)明:(以免陷入無(wú)意義的爭(zhēng)論)
1) ? 本文是站在開發(fā)者的角度來(lái)說(shuō)明的,所以,如果有朋友不同意我的觀點(diǎn),請(qǐng)也以開發(fā)者的角度來(lái)向我提出質(zhì)問(wèn)和討論,本人非常歡迎。
2) ? 本文難免要用 Windows 來(lái)和 Unix 做對(duì)比。這并不代表我不喜歡 Windows ,也不代表我要叫你放棄 Windows 。我們也知道這種對(duì)比已經(jīng)沒(méi)有什么意思了,但因?yàn)楸姸嗟呐笥驯? Windows 先入為主了,所以,我一定要拿 Windows 來(lái)開刀,才能扭轉(zhuǎn)那個(gè)“心理暗示”。僅此而已。
?????? OK ,言歸正傳。先說(shuō) Unix 的一個(gè)最重要的特點(diǎn)——“高內(nèi)聚,低藕合”!也就是說(shuō), Unix 下的各種應(yīng)用程序都和別人不相干。這就是貫穿整個(gè) Unix 的思維——模塊和程序的高度獨(dú)立性。這樣的設(shè)計(jì)和做法,會(huì)讓你的系統(tǒng)比較的穩(wěn)定,也會(huì)讓你的系統(tǒng)特別地容易管理和維護(hù)。 Unix 下的應(yīng)用程序們就像一支正規(guī)軍一樣排列地整整齊齊,只要司令(內(nèi)核)還在,系統(tǒng)是不會(huì)因?yàn)槟硞€(gè)軍隊(duì)的損失而無(wú)法自舉的。而 Windows 的應(yīng)用程序們就像一片樹林一樣,從地表上看過(guò)去,樹木們排列地整整齊齊,但是他們的樹根在地下卻相互纏繞在一起,剪不斷,理還亂,異常地復(fù)雜。
?????? “高內(nèi)聚,低藕合”的給 Unix 造成的結(jié)果是,其系統(tǒng)中基本上都是功能單一的小程序,這些小程序就像積木一樣,當(dāng)我們需要構(gòu)造建一個(gè)自定義的建筑時(shí),大多數(shù)情況下,我們只需要做的只是一個(gè)“搭積木”的簡(jiǎn)單游戲。 Windows 建設(shè)得富麗堂皇,可惜,別人的“積木”你幾乎不可能拿到自己的建筑中來(lái)。總是要你模仿或重寫。
(
插一句:
你是否注意到在網(wǎng)上下載
Windows
的軟件時(shí),會(huì)有一種所謂的“綠色軟件”?這就是對(duì)
Windows
的最大諷刺,
Windows
下裝一個(gè)軟件,
N
個(gè)
DLL
放到
Windows
系統(tǒng)目錄下,注冊(cè)表里寫入
N
個(gè)鍵值,還有很多你不知道的動(dòng)作。而在
Unix
裝軟件,你不用擔(dān)心你的系統(tǒng)目錄下會(huì)莫明其妙地多出些亂七八糟的文件。就是
copy
那么簡(jiǎn)單,那怕是
rpm
自動(dòng)安裝,安裝完后,你也能夠查詢到軟件安裝后對(duì)系統(tǒng)所做的改變。所以,你在
Unix
下分發(fā)你的軟件時(shí),你會(huì)覺(jué)得比
Windows
下要做得簡(jiǎn)單了許多許多。)
?????? 再說(shuō)說(shuō) Unix 的另一個(gè)最重要的特點(diǎn)——“所有的設(shè)備都可以像文件一樣地操作”。簡(jiǎn)單吧。所有的調(diào)備,文件、打印機(jī)、顯示器、終端、網(wǎng)絡(luò)、軟盤、磁帶、 USB 、 CDROM 、等等的 I/O 操作,都以文件描述符的方式進(jìn)行操作。兩個(gè) Unix 下最重要的系統(tǒng)調(diào)用 read/write 就可以勝任所有設(shè)備的 I/O 了。 Unix 早就在 /dev 目錄下為你建好了這些文件。使用起來(lái)很簡(jiǎn)單。
?????? 也許很多人都覺(jué)得 Unix 的命令行太過(guò)復(fù)雜。一個(gè)命令有著若干的參數(shù),異常地復(fù)雜。但之所以今天 Unix 下的應(yīng)用程序還在以字符界面為主,這恰好體現(xiàn)了 Unix 的簡(jiǎn)單的特征。這也是 Unix 的另一個(gè)特點(diǎn)——“命令的相互支持性”,命令們通過(guò)一個(gè)管道或是重定向,可以互相聯(lián)系在一起,再加以 Shell 腳本的支持,哪怕要實(shí)現(xiàn)一些復(fù)雜的功能(比如一個(gè)小型的文本數(shù)據(jù)庫(kù)),也是簡(jiǎn)單之極。
?????? 如果上面的論述依然不能讓你信服 Unix 很簡(jiǎn)單,那么,讓我們來(lái)用一些具體地實(shí)際的例子來(lái)看一下, Unix 是如何簡(jiǎn)單的。讓我們?cè)囍鱿旅娴倪@樣一個(gè)假設(shè):“如果我們?cè)趯W(xué)習(xí)編程的時(shí)候一開始是學(xué) Unix ,然后轉(zhuǎn)去做 Windows ”,那會(huì)是怎么樣的一個(gè)情況?
1) ? 我們?cè)? Unix 下創(chuàng)建進(jìn)程,使用 fork 調(diào)用。到了 Windows 下,我們查了 MSDN ,發(fā)現(xiàn)了一個(gè)叫 CreateProcess 的系統(tǒng)調(diào)用可以創(chuàng)建進(jìn)程,但我們卻發(fā)現(xiàn)這個(gè)系統(tǒng)調(diào)用有 10 個(gè)參數(shù)。而 Unix 下的 fork 卻一個(gè)參數(shù)都沒(méi)有。這種情況下,你是否會(huì)有一種頭大的感覺(jué)?因?yàn)椋? Unix 下,你根本看不到會(huì)有 10 參數(shù)這樣復(fù)雜的系統(tǒng)調(diào)用 API 。
2) ? 我們?cè)? Unix 下操作文件權(quán)限很簡(jiǎn)單,文件權(quán)限分三組(本人,同組,別人),每組都是可讀,可寫,可執(zhí)行。兩個(gè)簡(jiǎn)單的系統(tǒng)調(diào)用 chmod/chown 就搞定。到了 Windows 下,如果是 NTFS ,如果要以程序的方式設(shè)置文件權(quán)限,呵呵,你需要先了解什么是: SID ,什么是 DACL ,什么是 SACL ,什么是 ACE ,還有十幾相關(guān)的系統(tǒng) API 函數(shù)等著你。(參看我的《 以程序操作 NTFS 文件權(quán)限 》)你也許會(huì)覺(jué)得這么復(fù)雜的安全策略是讓系統(tǒng)更安全的基礎(chǔ),可以自從 Windows 出現(xiàn)的那一天以后,在安全方面的表現(xiàn)就沒(méi)有勝過(guò) Unix 。這無(wú)疑讓人感到 Windows 做了一件吃力不討好的事。
( 插一句 : Unix 下的用戶切換是相當(dāng)簡(jiǎn)易方便的。而 Windows 下的用戶切換會(huì)導(dǎo)致你需要退出當(dāng)前用戶的前臺(tái)程序。這導(dǎo)致了 Windows 下的用戶幾乎無(wú)一例外地都會(huì)選擇在超級(jí)用戶的權(quán)限下工作 / 上網(wǎng),這完全是讓自己的機(jī)器在裸奔,所以, Windows 下的病毒一旦在系統(tǒng)中運(yùn)行就為所欲為了。而 Unix 下,很少用戶會(huì)以 root 身份操作本機(jī),因?yàn)榍袚Q用戶非常方便。 )
3) ? 在 Unix 下,用戶有 ID ,用戶組有 ID ,進(jìn)程 / 線程都有 ID 。 ID 很簡(jiǎn)單易懂,就像我們的身份證一樣。到了 Windows 下,用戶標(biāo)識(shí)叫 Token ,進(jìn)程標(biāo)識(shí)叫 Handle (其實(shí)也就是一個(gè) DWORD 的類型),我看到網(wǎng)上很多問(wèn)題都在問(wèn) Windows 下的 Handle 的概念問(wèn)題。我一直在想,為什么微軟不取一個(gè)簡(jiǎn)單易懂的術(shù)語(yǔ)?要取得那么抽象,那么讓人很迷惑。雖然這讓 Windows 看起很 NB ,但也會(huì)因此加大了學(xué)習(xí)復(fù)雜度。( Windows 的開發(fā)學(xué)習(xí)復(fù)雜度要比 Unix 復(fù)雜多了,而且有太多的看似很高深的術(shù)語(yǔ)讓人一頭霧水)
4) ? 讓我們?cè)賮?lái)看一下用戶管理和程序所有者方面的東西。在 Unix 下,需要你做的是配置 NIS 服務(wù)器和 NFS 服務(wù)器(以 Autofs 自動(dòng) mount ),簡(jiǎn)潔,清楚。到了 Windows 下,與其相似的是一個(gè)叫 Domain 的東西(主域控制器),首先,為了加入域,你需要重啟電腦( Unix 下只需要配置 /etc/nsswitch.conf 文件來(lái)告訴本機(jī)的用戶登錄源,無(wú)需重啟),而對(duì)開發(fā)者來(lái)說(shuō), Unix 的這個(gè)配置對(duì)程序是完全透明的。而 Windows 的域用戶和本地用戶需要一個(gè)域名來(lái)區(qū)分。在程序中切換用戶時(shí), Unix 只需要 setuid/seteuid 就行了, Windows 對(duì)此有三個(gè)比較復(fù)雜的 API : CreateProcessAsUser, ImpersonateLoggedOnUser, LogonUser ,其復(fù)雜度就不用比較了。另外,在 Domain 方式下,你的 Document and Setting 目錄下的文件,會(huì)全部放到 Domain 服務(wù)器上去,你在別的機(jī)器上登錄時(shí),需要下載這些文件。最后,我倒不擔(dān)心你和網(wǎng)友的 MSN 聊天記錄會(huì)因?yàn)槟愕牡卿浂教幎际牵覔?dān)心的是,你在這么復(fù)雜的管理環(huán)境中寫出來(lái)的代碼是否能讓別人放心? :-(
5) ? 在 Unix 下,要把自己的程序加入系統(tǒng)的啟動(dòng)服務(wù)只需要在 /etc/init.d 中配置就行了。寫下一個(gè)有啟動(dòng)停止功能腳本,以特殊命名的方式鏈接到不同啟動(dòng)模式目錄下就行了。 Windows 下加一個(gè)啟動(dòng)服務(wù),如果你不編寫程序,估計(jì)比較困難。
6) ? 在 Unix 下,如果要取得系統(tǒng)的信息。只需要到 /proc 目錄下去 cat 那堆文件。所有進(jìn) / 線程的狀態(tài)、命令行、內(nèi)存 / 交換區(qū)使用情況、打開的文件描述符,等等,系統(tǒng)的 CPU ,內(nèi)存,交換區(qū),內(nèi)存文件 IO ,分區(qū),信息,網(wǎng)絡(luò),系統(tǒng)運(yùn)行狀態(tài),系統(tǒng)設(shè)備,等等,要有多詳細(xì)就有多詳細(xì),而且完全是純文本的,直接就可以看了。到了 Windows 下,要窮舉系統(tǒng)當(dāng)前進(jìn)程的信息,就不是一樣很容易的事,更別說(shuō)要取得別的信息了。
我很佩服微軟把操作系統(tǒng)搞得那么復(fù)雜,又是注冊(cè)表,又是安全策略,又是 OLE ,又是 COM ……。每次打開 regedit.exe 時(shí),我根本不敢碰 HKEY_CLASSES_ROOT ,因?yàn)槲铱粗锩婺切┏汕先f(wàn)個(gè) CLSID ,我有點(diǎn)暈菜。
自 1995 年以來(lái), 10 來(lái)年過(guò)去了。微軟推出了多種各式各樣的技術(shù)。我還記得 Visual Studio 6.0 中還有兩個(gè)叫做 FoxPro 和 J++ 的東西, FoxPro 來(lái)自 Foxbase ,還有個(gè)幾年, J++ 好像就沒(méi)有幾年。 ActiveX Control 完全是一個(gè)失敗的技術(shù),而那個(gè)叫做 VB 的編程語(yǔ)言,今天看來(lái),它的確毀了很多很有潛力的程序員。在 COM 出現(xiàn)的時(shí)候,不知道今天還有多少人還記得一個(gè)叫 MTS 的玩意?今天,不知道還有多少人記得有一個(gè)叫 ODBC 的東西?在這種復(fù)雜混亂的 Windows 世界中,是否讓你疲于追趕?今天的 .NET 不知道又有多少技術(shù)會(huì)隨著時(shí)間所沉淀?在 Windows 上面,我們學(xué)習(xí)了許多的失敗技術(shù)或是說(shuō)是過(guò)渡技術(shù)。而我們的 Unix 自從上紀(jì) 70 年代以來(lái),就沒(méi)有多大的變化,而因?yàn)? Unix 應(yīng)運(yùn)而生的 C 語(yǔ)言直到今天依然光彩奪目。我相信這個(gè) 30 多年來(lái)久經(jīng)考驗(yàn)還那么簡(jiǎn)單的 Unix 。
Unix 就是這么簡(jiǎn)單,各位想在 Unix 下學(xué)開發(fā)的朋友, Windows 那么復(fù)雜的操作系統(tǒng)都過(guò)來(lái)了,你還會(huì)怕這么簡(jiǎn)單的 Unix 么?
(
轉(zhuǎn)載時(shí)請(qǐng)注明作者和出處。未經(jīng)許可,請(qǐng)勿用于商業(yè)用途
)
更多文章請(qǐng)?jiān)L問(wèn)我的
Blog:
http://blog.csdn.net/haoel
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1533720
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
