陳皓程序員
不少編程的朋友都在網上問我這樣的幾個問題,Unix怎麼學?Unix怎麼這麼難?如何才能學好?而且讓我給他們一些學好Unix的經驗。在絕大多數時候,我發現問這些問題的朋友都有兩個特色: 1)對Unix有畏難心理,對其沒有信心; 2)喜歡用拿Windows來和Unix作比較。 這兩種特色就像兩個「心理暗示」,暗示着本身Unix很很差學,暗示着Unix很糟糕,不如Windows好。因而,本身也就被本身的這種長期的「暗示」所催眠了。由於,從一開始就有畏難情緒,因此也就以爲Unix很差,以爲很是很吃力,最後還會致使對Unix的厭惡和反感的情緒。因此,爲了糾正上述朋友們的「心理暗示」。我想寫下這篇文章,想告訴你們,Unix真的很簡單。 在正式敘述「簡單的Unix」以前,我想作幾點說明:(以避免陷入無心義的爭論) 1) 本文是站在開發者的角度來講明的,因此,若是有朋友不一樣意個人觀點,請也以開發者的角度來向我提出質問和討論,本人很是歡迎。 2) 本文不免要用Windows來和Unix作對比。這並不表明我不喜歡Windows,也不表明我要叫你放棄Windows。咱們也知道這種對比已經沒有什麼意思了,但由於衆多的朋友被Windows先入爲主了,因此,我必定要拿Windows來開刀,才能扭轉那個「心理暗示」。僅此而已。 OK,言歸正傳。先說Unix的一個最重要的特色——「高內聚,低藕合」!也就是說,Unix下的各類應用程序都和別人不相干。這就是貫穿整個Unix的思惟——模塊和程序的高度獨立性。這樣的設計和作法,會讓你的系統比較的穩定,也會讓你的系統特別地容易管理和維護。Unix下的應用程序們就像一支正規軍同樣排列地整整齊齊,只要司令(內核)還在,系統是不會由於某個軍隊的損失而沒法自舉的。而Windows的應用程序們就像一片樹林同樣,從地表上看過去,樹木們排列地整整齊齊,可是他們的樹根在地下卻相互纏繞在一塊兒,剪不斷,理還亂,異常地複雜。 「高內聚,低藕合」的給Unix形成的結果是,其系統中基本上都是功能單一的小程序,這些小程序就像積木同樣,當咱們須要構造建一個自定義的建築時,大多數狀況下,咱們只須要作的只是一個「搭積木」的簡單遊戲。Windows建設得富麗堂皇,惋惜,別人的「積木」你幾乎不可能拿到本身的建築中來。老是要你模仿或重寫。 (插一句:你是否注意到在網上下載Windows的軟件時,會有一種所謂的「綠色軟件」?這就是對Windows的最大諷刺,Windows下裝一個軟件,N個DLL放到Windows系統目錄下,註冊表裏寫入N個鍵值,還有不少你不知道的動做。而在Unix裝軟件,你不用擔憂你的系統目錄下會莫明其妙地多出些亂七八糟的文件。就是copy那麼簡單,那怕是rpm自動安裝,安裝完後,你也可以查詢到軟件安裝後對系統所作的改變。因此,你在Unix下分發你的軟件時,你會以爲比Windows下要作得簡單了許多許多。) 再說說Unix的另外一個最重要的特色——「全部的設備均可以像文件同樣地操做」。簡單吧。全部的調備,文件、打印機、顯示器、終端、網絡、軟盤、磁帶、USB、CDROM、等等的I/O操做,都以文件描述符的方式進行操做。兩個Unix下最重要的系統調用read/write就能夠勝任全部設備的I/O了。Unix早就在/dev目錄下爲你建好了這些文件。使用起來很簡單。 也許不少人都以爲Unix的命令行太過複雜。一個命令有着若干的參數,異常地複雜。但之因此今天Unix下的應用程序還在以字符界面爲主,這剛好體現了Unix的簡單的特徵。這也是Unix的另外一個特色——「命令的相互支持性」,命令們經過一個管道或是重定向,能夠互相聯繫在一塊兒,再加以Shell腳本的支持,哪怕要實現一些複雜的功能(好比一個小型的文本數據庫),也是簡單之極。 若是上面的論述依然不能讓你信服Unix很簡單,那麼,讓咱們來用一些具體地實際的例子來看一下,Unix是如何簡單的。讓咱們試着作下面的這樣一個假設:「若是咱們在學習編程的時候一開始是學Unix,而後轉去作Windows」,那會是怎麼樣的一個狀況? 1) 咱們在Unix下建立進程,使用fork調用。到了Windows下,咱們查了MSDN,發現了一個叫CreateProcess的系統調用能夠建立進程,但咱們卻發現這個系統調用有10個參數。而Unix下的fork卻一個參數都沒有。這種狀況下,你是否會有一種頭大的感受?由於,在Unix下,你根本看不到會有10參數這樣複雜的系統調用API。 2) 咱們在Unix下操做文件權限很簡單,文件權限分三組(本人,同組,別人),每組都是可讀,可寫,可執行。兩個簡單的系統調用chmod/chown就搞定。到了Windows下,若是是NTFS,若是要以程序的方式設置文件權限,呵呵,你須要先了解什麼是:SID,什麼是DACL,什麼是SACL,什麼是ACE,還有十幾相關的系統API函數等着你。(參看個人《以程序操做NTFS文件權限》)你也許會以爲這麼複雜的安全策略是讓系統更安全的基礎,能夠自從Windows出現的那一天之後,在安全方面的表現就沒有賽過Unix。這無疑讓人感到Windows作了一件吃力不討好的事。 (插一句:Unix下的用戶切換是至關簡易方便的。而Windows下的用戶切換會致使你須要退出當前用戶的前臺程序。這致使了Windows下的用戶幾乎無一例外地都會選擇在超級用戶的權限下工做/上網,這徹底是讓本身的機器在裸奔,因此,Windows下的病毒一旦在系統中運行就隨心所欲了。而Unix下,不多用戶會以root身份操做本機,由於切換用戶很是方便。) 3) 在Unix下,用戶有ID,用戶組有ID,進程/線程都有ID。ID很簡單易懂,就像咱們的身份證同樣。到了Windows下,用戶標識叫Token,進程標識叫Handle(其實也就是一個DWORD的類型),我看到網上不少問題都在問Windows下的Handle的概念問題。我一直在想,爲何微軟不取一個簡單易懂的術語?要取得那麼抽象,那麼讓人很迷惑。雖然這讓Windows看起很NB,但也會所以加大了學習複雜度。(Windows的開發學習複雜度要比Unix複雜多了,並且有太多的看似很高深的術語讓人一頭霧水) 4) 讓咱們再來看一下用戶管理和程序全部者方面的東西。在Unix下,須要你作的是配置NIS服務器和NFS服務器(以Autofs自動mount),簡潔,清楚。到了Windows下,與其類似的是一個叫Domain的東西(主域控制器),首先,爲了加入域,你須要重啓電腦(Unix下只須要配置/etc/nsswitch.conf文件來告訴本機的用戶登陸源,無需重啓),而對開發者來講,Unix的這個配置對程序是徹底透明的。而Windows的域用戶和本地用戶須要一個域名來區分。在程序中切換用戶時,Unix只須要setuid/seteuid就好了,Windows對此有三個比較複雜的API:CreateProcessAsUser, ImpersonateLoggedOnUser, LogonUser,其複雜度就不用比較了。另外,在Domain方式下,你的Document and Setting目錄下的文件,會所有放到Domain服務器上去,你在別的機器上登陸時,須要下載這些文件。最後,我倒不擔憂你和網友的MSN聊天記錄會由於你的登陸而處處都是,我擔憂的是,你在這麼複雜的管理環境中寫出來的代碼是否能讓別人放心?:-( 5) 在Unix下,要把本身的程序加入系統的啓動服務只須要在/etc/init.d中配置就好了。寫下一個有啓動中止功能腳本,以特殊命名的方式連接到不一樣啓動模式目錄下就好了。Windows下加一個啓動服務,若是你不編寫程序,估計比較困難。 6) 在Unix下,若是要取得系統的信息。只須要到/proc目錄下去cat那堆文件。全部進/線程的狀態、命令行、內存/交換區使用狀況、打開的文件描述符,等等,系統的CPU,內存,交換區,內存文件IO,分區,信息,網絡,系統運行狀態,系統設備,等等,要有多詳細就有多詳細,並且徹底是純文本的,直接就能夠看了。到了Windows下,要窮舉系統當前進程的信息,就不是同樣很容易的事,更別說要取得別的信息了。 我很佩服微軟把操做系統搞得那麼複雜,又是註冊表,又是安全策略,又是OLE,又是COM……。每次打開regedit.exe時,我根本不敢碰HKEY_CLASSES_ROOT,由於我看着裏面那些成千上萬個CLSID,我有點暈菜。 自1995年以來,10來年過去了。微軟推出了多種各式各樣的技術。我還記得Visual Studio 6.0中還有兩個叫作FoxPro和J++的東西,FoxPro來自Foxbase,還有個幾年,J++好像就沒有幾年。ActiveX Control徹底是一個失敗的技術,而那個叫作VB的編程語言,今天看來,它的確毀了不少頗有潛力的程序員。在COM出現的時候,不知道今天還有多少人還記得一個叫MTS的玩意?今天,不知道還有多少人記得有一個叫ODBC的東西?在這種複雜混亂的Windows世界中,是否讓你疲於追趕?今天的.NET不知道又有多少技術會隨着時間所沉澱?在Windows上面,咱們學習了許多的失敗技術或是說是過渡技術。而咱們的Unix自從上紀70年代以來,就沒有多大的變化,而由於Unix應運而生的C語言直到今天依然光彩奪目。我相信這個30多年來久經考驗還那麼簡單的Unix。 Unix就是這麼簡單,各位想在Unix下學開發的朋友,Windows那麼複雜的操做系統都過來了,你還會怕這麼簡單的Unix麼? 數據庫