其實Unix很簡單

来源:http://www.cnblogs.com/jice1990/archive/2016/04/28/5441400.html
-Advertisement-
Play Games

本文轉載自http://blog.csdn.net/haoel 陳皓專欄 很多編程的朋友都在網上問我這樣的幾個問題,Unix怎麼學?Unix怎麼這麼難?如何才能學好?並且讓我給他們一些學好Unix的經驗。在絕大多數時候,我發現問這些問題的朋友都有兩個特點: 1)對Unix有畏難心理,對其沒有信心; ...


本文轉載自http://blog.csdn.net/haoel 陳皓專欄

很多編程的朋友都在網上問我這樣的幾個問題,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下裝一個軟體,NDLL放到Windows系統目錄下,註冊表裡寫入N個鍵值,還有很多你不知道的動作。而在Unix裝軟體,你不用擔心你的系統目錄下會莫明其妙地多出些亂七八糟的文件。就是copy那麼簡單,那怕是rpm自動安裝,安裝完後,你也能夠查詢到軟體安裝後對系統所做的改變。所以,你在Unix下分發你的軟體時,你會覺得比Windows下要做得簡單了許多許多。)

 

       再說說Unix的另一個最重要的特點——“所有的設備都可以像文件一樣地操作”。簡單吧。所有的調備,文件、印表機、顯示器、終端、網路、軟盤、磁帶、USBCDROM、等等的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,進程/線程都有IDID很簡單易懂,就像我們的身份證一樣。到了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對此有三個比較複雜的APICreateProcessAsUser, 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中還有兩個叫做FoxProJ++的東西,FoxPro來自Foxbase,還有個幾年,J++好像就沒有幾年。ActiveX Control完全是一個失敗的技術,而那個叫做VB的編程語言,今天看來,它的確毀了很多很有潛力的程式員。在COM出現的時候,不知道今天還有多少人還記得一個叫MTS的玩意?今天,不知道還有多少人記得有一個叫ODBC的東西?在這種複雜混亂的Windows世界中,是否讓你疲於追趕?今天的.NET不知道又有多少技術會隨著時間所沉澱?在Windows上面,我們學習了許多的失敗技術或是說是過渡技術。而我們的Unix自從上紀70年代以來,就沒有多大的變化,而因為Unix應運而生的C語言直到今天依然光彩奪目。我相信這個30多年來久經考驗還那麼簡單的Unix

 

Unix就是這麼簡單,各位想在Unix下學開發的朋友,Windows那麼複雜的操作系統都過來了,你還會怕這麼簡單的Unix麽?

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 作為初學者,現在接觸的資料庫都屬於比較小的哪一種,對於資料庫處理以及所提供的數據操縱等功能並沒有很深刻的認識。所以接觸較大的數據量以及比較複雜的查詢操作是進一步認識資料庫強大的必要過程。不過在處理較大數據量之前還是要將基礎的知識學扎實。 先從比較小的數據量開始。 例1 下麵列舉一個高中某班高考錄取情 ...
  • 複製功用: 數據分佈 負載均衡:讀操作,適用於讀密集型的應用 備份 高可用和故障切換 MySQL升級測試 在從伺服器上有兩個線程: I/O線程:從master請求二進位日誌信息,並保存至中繼日誌 SQL線程:從relay log中讀取日誌信息,在本地完成重放 在主伺服器上為每個從伺服器的I/O線程啟 ...
  • MySQL事務操作 事務rollback mysql> start transaction; Query OK, 0 rows affected (0.00 sec) mysql> insert into tbtest(stu_ID,stu_Name) values(201,'stu_1'); Qu... ...
  • 選擇題 1、要保證資料庫的邏輯數據獨立性,需要修改的是||A||。 A: 模式與外模式之間的映射 B: 模式與內模式之間的映射 C: 模式 D: 三級模式 2、資料庫系統的數據獨立性體現在||B||。 A: 不會因為數據的變化而影響到應用程式 B: 不會因為數據存儲結構與數據邏輯結構的變化而影響應用 ...
  • 360網盤 https://yunpan.cn/cPxT6CV9Kydyb 訪問密碼 1df9 ...
  • 修改grub項 修改其中三項 為 更新grub 設置systemd 重啟見效 參見文獻(URL): http://ask.xmodulo.com/boot-into-command-line-ubuntu-debian.html ...
  • 以下是由本人測試可用的pptpd構架方法 按步驟: 運行環境Centeros 6 *首先運行如下命令: cat /dev/net/tun 返回的必須是: cat: /dev/net/tun: File descriptor in bad state 運行: cat /dev/ppp 返回的必須是: ...
  • Ubuntu操作基本快捷鍵* 打開主菜單 = Alt + F1* 運行 = Alt + F2* 顯示桌面 = Ctrl + Alt + d* 最小化當前視窗 = Alt + F9* 最大化當前視窗 = Alt + F10* 關閉當前視窗 = Alt + F4* 截取全屏 = Print Screen ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...