今天,我們在文章中會用一些具體地實際的例子讓你信服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函數等著你。
你也許會覺得這麼復雜的安全策略是讓系統更安全的基礎,可以自從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操作系統麼?