我們都知道C語言,C語言提供了通用的函數比如fread fwrite fclose,不論你在windows linux還是其他 操作系統上,都可以使用.這就是平臺無關性,所以C語言有很好的移植性.接下來我們思考一個問題,不同的操作系統windows linux,他們的設計肯定不一樣的,windows再設計之處肯定不會 考慮linux的設計,linux在設計之處也不會向微軟請教.所以問題是為什么都可以使用標準的C函數 ?
這要從操作系統 的系統調用說起.高級的操作系統都分為用戶態和內核態,說白了用戶態就是執行用戶程序的,比如QQ 微信.而內核是 操作系統管理硬件 內存 CPU的,應用程序因為在用戶態所以無法訪問硬件,這也保證了操作系統的安全性. 但是有時候應用程序需要操作硬件,比如打開攝像頭,那怎么辦呢.
解決辦法就是用戶程序請求操作系統打開,操作系統接收請求去打開硬件.所以真實的訪問過程不是應用程序直接訪問. 應用程序如何請求操作系統呢?這就是系統調用的功能.因為不同的操作系統管理方式 硬件訪問方式幾乎完全不同,所以不同的操作系統提供了完全不同的系統調用接口.這些接口 又稱為系統函數.
比如常見的linux下API:read write close open socket都是系統函數 ,可以完成操作系統的各種功能.windows上API 是不相同的,所以如果你直接使用這些系統函數,寫出來的代碼不具有移植性.
那怎么辦呢?解決方法就是對系統函數封裝一層,封裝為C庫. C庫 對外提供統一的接口,不同的操作系統提供不同的C庫,但是不同的C庫對外提供相同的 API,這也就保證了你基于C庫開發的代碼在不同的操作系統上具有 很好的移植性.記住,是很好,而不是絕對的.針對一些特殊的功能,我們也是針對操作系統進行處理.
下面一張圖來解釋他們之間的關系: