kernel shell bash简介
還記得我們在Linux啟動的時候。首先會啟動內核 (kernel),內核是一段計算機程序,這個程序直接管理管理硬件,包括CPU、內存空間、硬盤接口、網絡接口等等。所有的計算機操作都要通過內核傳遞給硬件。
?
為了我們方便調用內核,我們將內核的功能總結成為系統調用(system call)。系統調用看起來就像是的C語言函數,你也可以在程序中直接調用。Linux系統有兩百多個這樣的系統調用。系統調用給了上層程序一個清晰的接口,隱藏了內核的復雜結構。一個操作系統上的功能可以看作是系統調用的組合的效果,而且一個操作系統不可能作出超越系統調用的動作。可以說一個系統調用函數就像是漢字的一個筆畫,任何一個漢字都要由基本的筆畫(點、橫、撇等等)構成,而且我們不能臆造出筆畫。在命令行中輸入$man 2 syscalls可以查看所有的系統調用。你也可以通過$man 2 read來查看系統調用read()的說明。在這兩個命令中的2都表示我們要在2類(系統調用類)中查詢 (具體各個類是什么可以通過$man man看到)。
?
由于系統調用非常基礎,所以有時使用起來很麻煩。比如說一個簡單的給變量分配內存空間的操作,就需要動用多個系統調用。Linux定義一些庫函數(library routine)來將系統調用組合成某些常用的功能,以方便我們編程。比如上面的分配內存的操作,看以定義成為一個庫函數(像malloc()這樣的函數)。再比如說,在讀取文件的時候,系統調用要求我們設置好所需要的緩沖。我們這個時候可以使用Standard IO庫中的讀取函數,而這個讀取函數既負責設置緩沖,又負責使用讀取的系統調用函數。使用庫函數對于機器來說并沒有效率上的優勢,但可以把程序員從細節中解救出來。庫函數就像是漢字的偏旁部首,它由筆畫組成,但使用偏旁部首更容易組成字,比如"鐵"。當然,你也完全可以不使用庫函數,而直接調用系統函數,就像“人”字一樣,不用偏旁部首。
(實際上,一個操作系統要稱得上是UNIX系統,必須要擁有一些庫函數,比如ISO C標準庫,POSIX標準等。)
?
至于shell,可以看作一種特殊的應用。實際上我們之前所說的命令行,就是shell。shell是一個命令解釋器(interpreter),當我們輸入“ls -l”的時候,它將此字符串解釋為1) 在默認路徑找到該文件(/bin/ls),2) 執行該文件,并附帶參數"-l"。我們之前用>表示重新定向,用|表示管道,也是通過shell進行理解&或者|的含義,再通過系統調用指揮kernel建立具體的重定向或者管道機制。在沒有圖形界面之前,shell充當了用戶的界面,當用戶要運行某些應用的時候,要通過shell輸入命令,以建立運行程序。shell可以執行符合shell語法的文本,這樣的文本叫做shell腳本(script)。我們可以在圖中看到,shell下通系統調用,上通各種應用,同時還有許多自身的便利可以使用,這些條件讓shell腳本可以實現非常強大的功能。UNIX的一條哲學是讓每個程序盡量獨立的做好一個小的功能。而shell充當了這些小功能之間的"膠水",讓不同程序能夠以一個清晰的接口(文本流)協同工作,從而增強各個程序的功能。(這也是我們鼓勵多用shell,少用圖形化界面的原因之一。)
?
轉載于:https://blog.51cto.com/shisen/1842153
總結
以上是生活随笔為你收集整理的kernel shell bash简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PostgreSQL 最佳实践 - 水平
- 下一篇: crond定时任务详细分析