----------------------------------------------一切關於Linux的知識點都記錄在這裏-------------------------------------------------------
html
在命令行中輸入$man 2 syscalls能夠查看全部的系統調用。能夠經過$man 2 read來查看系統調用read()的說明。在這兩個命令中的2都表示咱們要在2類(系統調用類)中查詢(具體各個類是什麼能夠經過$man man看到)。shell
>表示從新定向,|表示管道多線程
Linux老鳥鼓勵新手多用shell,少用圖形化界面。一個shell對應一個終端(terminal)。併發
Linux利用內核實現軟硬件的對話。經過系統調用這個接口,Linux將上層的應用與下層的內核分離,隱藏了底層的複雜性,也提升了上層應用的可移植性。spa
如何瞭解一個陌生的命令?命令行
$which ls 在默認路徑中搜索命令,返回該命令的絕對路徑。線程
$whereis ls 在相對比較大的範圍搜索命令,返回該命令的絕對路徑。orm
$whatis ls 用很簡短的一句話來介紹命令。
htm
$man ls 查詢簡明的幫助手冊。blog
$info ls 查詢更詳細的幫助信息。
文件操做相關:
$touch a.txt
$cp a.txt a.txt 在工做目錄下,將a.txt複製到文件b.txt
$mv a.txt c.txt 將a.txt移動成爲c.txt(至關於重命名rename)
$rm a.txt 刪除a.txt
$rm -r /home/vamei 刪除從/home/vamei向下的整個子文件系統。-r表示recursive,是指重複刪除的操做,/home/vamei文件夾爲空,而後刪除/home/vamei文件夾自己。
$rm -rf /home/kevin/temp/ f的目的是告訴rm放心幹,不用再確認了。
$mkdir /home/vamei/good 建立一個新的目錄
$rmdir /home/vamei/good 刪除一個空的目錄
$chmod 755 a.txt
(你必須是文件a.txt的擁有者才能運行此命令。或者以$sudo chmod 755 a.txt的方式,以超級用戶的身份運行該命令。)
change mode 改變a.txt的讀、寫以及執行權限。還記得每一個文件都有九位的讀寫執行權限(參看 Linux文件管理背景知識),分爲三組,分別對應擁有者(owner),擁有組(owner group)中的用戶和全部其餘用戶(other)。在這裏,咱們也有三個數字,755,對應三個組。7被分配給擁有者,5被分配給擁有組,最後一個5分配給其它用戶。Linux規定: 4爲有讀取的權利,2爲有寫入的權利,1爲有執行的權利。咱們看到的7其實是4 + 2 + 1,表示擁有者有讀、寫、執行三項權利。(想一想5 意味着什麼)
這時,運行$ls -l a.txt, 你應該看到九位的權限變成了rwxr-xr-x。根據本身的須要,你能夠用好比444, 744代替755,來讓文件有不一樣的權限。
當Linux執行一個程序的時候,會自動打開三個流,標準輸入,標準輸出,標準錯誤。好比說你打開命令行的時候,默認狀況下,命令行的標準輸入鏈接到鍵盤,標準輸出和標準錯誤都鏈接到屏幕。對於一個程序來講,儘管它總會打開者三個流,但它會根據須要使用,並非必定要使用。
$ls > a.txt 從新定向
$ls >> a.txt 這裏>>的做用也是從新定向標準輸出。若是a.txt已經存在的話,ls產生的文本流會附加在a.txt的結尾,而不會像>那樣每次都新建a.txt。
echo的做用是將文本流導向標準輸出。
$echo hello > a.txt
咱們將cat標準輸入指向a.txt,文本會從文件流到cat,而後再輸出到屏幕上。固然,咱們還能夠同時從新定向標準輸出:$cat < a.txt > b.txt 這樣,a.txt的內容就複製到了b.txt中。
咱們還可使用>&來同時從新定向標準輸出和標準錯誤。假設咱們並無一個目錄void。那麼$cd void > a.txt會在屏幕上返回錯誤信息。由於此時標準錯誤依然指向屏幕。當咱們使用:$cd void >& a.txt 錯誤信息被導向a.txt。
$cat eee &>> a.txt 附加到最後
若是隻是想從新定向標準錯誤,可使用2>:$cd void 2> a.txt > b.txt 標準錯誤對應的老是2號,因此有以上寫法。標準錯誤輸出到a.txt,標準輸出輸出到b.txt。
-------------------------------------------------------------------------------------
管道(pipe):理解了以上內容以後,管道的概念就易如反掌。管道能夠將一個命令的輸出導向另外一個命令的輸入,從而讓兩個(或者更多命令)像流水線同樣連續工做,不斷地處理文本流。在命令行中,咱們用|表示管道:
$cat < a.txt | wc
wc命令表明word count,用於統計文本中的行,詞以及字符總數。a.txt中的文本先流到cat,而後從cat的標準輸出流到wc的標準輸入,從而讓wc知道本身要處理的是a.txt這個字符串。
$echo abcd | wc
Linux的各個命令實際上高度商業化,並儘可能相互獨立。對每個都只專一於一個小的功能。但經過pipe,咱們能夠將這些功能合在一塊兒,實現一些複雜的目的。
-------------------------------------------------------------------------------
如何建立一個新進程?
實際上,當計算機開機的時候,內核(kernel)只創建了一個init進程。Linux kernel並不提供直接創建新進程的系統調用。剩下的全部進程都是init進程經過fork機制創建的。新的進程要經過老的進程複製自身獲得,這就是fork。fork是一個系統調用。進程存活於內存中。每一個進程都在內存中分配有屬於本身的一片空間 (address space)。當進程fork的時候,Linux在內存中開闢出一片新的內存空間給新的進程,並將老的進程空間中的內容複製到新的空間中,此後兩個進程同時運行。
老進程成爲新進程的父進程(parent process),而相應的,新進程就是老的進程的子進程(child process)。一個進程除了有一個PID以外,還會有一個PPID(parent PID)來存儲的父進程PID。若是咱們循着PPID不斷向上追溯的話,總會發現其源頭是init進程。因此說,全部的進程也構成一個以init爲根的樹狀結構。
還能夠用$pstree命令來顯示整個進程樹。
進程與線程(Thread)
儘管在UNIX中,進程與線程是有聯繫但不一樣的兩個東西,但在Linux中,線程只是一種特殊的進程。多線程之間能夠共享內存空間和IO接口。因此,進程是Linux程序的惟一的實現方式。
Linux進程間通訊
信號能夠看做一種粗糙的進程間通訊(IPC,interprocess communication)的方式,用以向進程封閉的內存空間傳遞信息。爲了讓進程間傳遞更多的信息量,咱們須要其餘的進程間通訊方式。這些進程間通訊方式能夠分爲兩種:
管道機制。咱們可使用管道將一個進程的輸出和另外一個進程的輸入鏈接起來,從而使用文件操做API來管理進程間通訊。在shell中,咱們常常利用管道將多個進程鏈接在一塊兒,從而讓各個進程協做,實現複雜的功能。
傳統IPC。咱們主要是指消息隊列,信號量,共享內存。這些IPC的特色是容許多進程之間共享資源,這與多線程共享heap和global data相相似。因爲多進程任務具備併發性,因此在共享資源的時候也必須解決同步的問題。