序
傳智播客和“黑馬程序員”
江蘇傳智播客教育科技股份有限公司(簡稱“傳智播客”)是一家專門致力于培養高素質軟件開發人才的科技公司,“黑馬程序員”是傳智播客旗下的高端IT教育品牌。
“黑馬程序員”的學員多為大學畢業后想從事IT行業,但各方面條件還不成熟的年輕人。“黑馬程序員”的學員篩選制度非常嚴格,包括嚴格的技術測試、自學能力測試以及性格測試、壓力測試、品德測試等。百里挑一的殘酷篩選制度確保了學員質量,并降低了企業的用人風險。
自“黑馬程序員”成立以來,教學研發團隊一直致力于打造精品課程資源,不斷在產、學、研三個層面創新自己的執教理念與教學方針,并集中“黑馬程序員”的優勢力量,有針對性地出版了計算機系列教材五十多種,制作了教學視頻數十套,并發表了各類技術文章數百篇。
“黑馬程序員”不僅斥資研發IT系列教材,還為高校師生提供以下配套學習資源與服務。
為大學生提供的配套服務:
(1) 專業的輔助學習平臺“博學谷”(http://yx.boxuegu.com),有專業老師在線為您答疑解惑。
(2) 針對高校學生在學習過程中存在的壓力等問題,我們還面向大學生量身打造了“播妞”。播妞不僅致力推行快樂學習,還會有定期的助學紅包雨。有興趣的同學可添加播妞微信/QQ: 208695827。
(3) 高校學生也可掃描右方二維碼,加入播妞粉絲團,獲取最新學習資源,與播妞一起快樂學習。
為IT教師提供的配套服務:
針對高校教學,“黑馬程序員”為IT系列教材精心設計了“教案+授課資源+考試系統+題庫+教學輔助案例”的系列教學資源。高校老師請關注碼大牛老師微信/QQ: 2011168841,獲取教材配套資源,也可以掃描右方二維碼,加入專為IT教師打造的師資服務平臺——“教學好助手”,獲取“黑馬程序員”最新教師教學輔助資源相關動態。
前言
隨著互聯網的發展,計算機新技術如雨后春筍,層出不窮,這也促使越來越多的學子投入到計算機的學習與研發中;而二十多年來,Linux操作系統已逐漸被越來越多的人接受和認可,并被眾多企業廣泛應用到服務器以及嵌入式開發等領域。因此,Linux操作系統的使用以及基于Linux的應用開發成為計算機專業學子應掌握的必備技能。
然而,黑馬程序員在近些年的觀察和研究中發現: 面臨就業的高校學子雖已經學習了編程語言與操作系統等的相關課程,但缺乏動手能力,難以將理論聯系到實際。這皆因他們所用教材不是體系結構不夠系統,就是知識不夠全面,再加上講解的知識較深奧,以至于學子難以掌握切實可用的實質。
針對這種現象,黑馬程序員決定推出一本更符合學生實際需求的教材。為保障學生在學習的過程中能學有所得,在學習之后能學以致用,黑馬程序員經過大量調研與長期編寫,推出了本書,作為Linux課程的初級教材。
為什么要學習本書
Linux操作系統自誕生至今逐步發展并日漸完善,因其開源、安全、穩定等特性,成為眾多企業與政府部門搭建服務器的首選平臺。此外,Linux在移動應用與嵌入式開發領域也被廣泛采用,因此掌握Linux系統的使用與Linux平臺下的程序開發方法成為眾多計算機從業人員需要掌握的必備技能。
本書在大綱制定上參照了傳智播客C/C++學院數年來結合計算機發展趨勢及企業需求所研發課程體系中的Linux系統編程部分,涵蓋了Linux基本操作、常用工具、系統管理與程序開發等使用Linux系統以及在Linux環境下進行開發所需的必要知識;在內容安排上,由Linux環境搭建入手,逐步講解了Linux的基本操作、常用工具、系統管理以及程序開發等知識,由淺入深,由易到難,循序漸進;在講解方式上,將理論與實踐相結合,為大多知識點都配備相應案例,保障讀者能將理論與實踐結合,在掌握理論知識的同時強化動手能力。
如何使用本書
本書以與企業中所用環境(Red Hat Enterprise Linux)較為接近的Linux版本(CentOS 6.8)為開發環境,主要介紹Linux系統的使用與Linux環境下的程序開發。本書中涉及的命令、語法與系統調用都配備了具體的案例,旨在讓讀者了解Linux平臺下的常用服務器前言Linux編程基礎模型。
若本書用于課堂教學,建議教師在講解理論知識后,先引導學生自主動手實現教材中提供的案例,培養學生思考問題、分析問題、解決問題的能力,以期學生可更深刻地理解、掌握相應知識。
若讀者為自主學習者,建議您勤思考、勤練習、勤總結,盡量完成并熟練掌握教材中配備的案例,并通過章節配套測試題進行自我檢測和查漏補缺。若您在學習的過程中遇到困難或者有疑惑,可向問答精靈咨詢。
本教材共分11章,每章的大體內容如下。
第1章首先介紹Linux系統的背景,包括Linux的起源、發展、應用領域、常用版本,以及GNU項目計劃和POSIX版本;之后介紹Linux環境搭建過程;最后介紹VMware虛擬網絡配置、Linux的遠程終端訪問和遠程文件管理。通過本章的學習,讀者可對Linux系統的背景有所了解,并能順利搭建Linux環境,掌握Linux的遠程終端訪問方式及遠程文件的管理。
第2章講解Linux系統中的基本命令與開發工具,其中基本命令部分介紹與文件、網絡、通信、壓縮解壓及幫助相關的命令,開發工具部分介紹vi編輯器、GCC編譯器與GDB調試工具。掌握本章所講的知識,可提高Linux系統使用與Linux環境開發的效率。
第3章講解Linux系統中與用戶、用戶組管理相關的知識。Linux是一個支持多用戶的操作系統,通過本章的學習,讀者應能掌握Linux系統中管理用戶、用戶組的命令,以及用戶切換的方法。
第4章講解Linux的內核——Shell的相關知識、Shell應用技巧以及Shell腳本編程的相關語法。其中Shell編程語法包括Shell變量、條件語句、循環語句、函數,4.6節還給出了Shell腳本的調試方法。
第5章講解磁盤與目錄、Linux文件系統、Linux文件類型與文件操作,其中重點為磁盤的邏輯分區方式、文件系統的結構、文件操作。通過本章的學習,讀者應掌握以上重點知識,并熟悉磁盤分區、掛載、卸載的方式與創建文件系統的方法。
第6章講解Linux進程管理相關的知識,包括進程處理機制、進程屬性、進程控制以及進程管理命令。通過本章的學習,讀者應熟練掌握進程的處理機制,以及控制進程的方法,包括創建進程、退出進程與進程同步等。
第7章講解Linux系統中的信號機制,包括信號來源、產生方式、信號阻塞、信號捕獲和時序競態等知識。通過本章的學習,讀者應能在終端與程序中使用信號管理和控制進程。
第8章講解進程間通信的方式,包括管道通信、消息隊列通信、信號量通信與共享內存通信。通過本章的學習,讀者應熟悉Linux系統中進程通信的這幾種機制,并能在程序中使用這些機制實現進程通信。
第9章主要講解Linux系統中的線程,包括線程的定義、線程相關操作、線程的屬性,以及實現線程同步的機制。線程操作包括創建線程、退出線程、終止線程、掛起線程和線程分離,通過設置線程的屬性亦可實現其中的部分操作。線程同步可通過互斥鎖、條件變量、信號量實現。學習本章之后,讀者應能在Linux環境開發中熟練操作線程、掌握線程同步機制,并熟悉線程的屬性、可通過線程屬性設置線程的狀態。
第10章主要講解socket編程,即Linux系統中的網絡編程。其中首先簡述計算機網絡的協議與體系結構,之后講解了socket編程中用到的系統調用、基于TCP和UDP兩種協議的通信流程并補充網絡編程中所需的知識,通過實際案例展示了不同協議下基于C/S模型的通信方式,最后對socket本地通信作了簡單介紹。
第11章對Linux系統中涉及的幾種并發服務器模型作了講解,包括多進程并發服務器、多線程并發服務器、I/O多路轉接服務器、線程池,最后對epoll的工作模式進行了補充。通過本章的學習,讀者應對Linux系統中的服務器有所了解。
讀者若不能完全理解教材中所講知識,可登錄博學谷平臺,配合平臺中的教學視頻進行學習。此外讀者在學習的過程中,務必要勤于練習,確保真正掌握所學知識。若在學習的過程中遇到無法解決的困難,建議讀者莫要糾結于此,繼續往后學習,或可豁然開朗。
致謝
本教材的編寫和整理工作由傳智播客教育科技股份有限公司完成,主要參與人員有呂春林、高美云、薛蒙蒙、鄭瑤瑤、韓冬、王曉娟、劉傳梅、朱景堯、王保明、劉宗偉等。全體人員在這近一年的編寫過程中付出了很多辛勤的汗水。
意見反饋
盡管我們盡了最大的努力,但教材中難免會有不妥之處,歡迎各界專家和讀者朋友們來信來函給予寶貴意見,我們將不勝感激。您在閱讀本書時,如發現任何問題或有不認同之處,可以通過電子郵件與我們取得聯系。
黑馬程序員
2017年6月于北京
第5章Linux文件系統與操作學習目標
了解磁盤分區與目錄結構
掌握ext2文件系統布局
掌握數據塊尋址方式
熟悉Linux系統中的文件類型
掌握Linux系統中實現I/O操作的方法計算機之所以能運行,是因為在機器硬件上配備了完整的操作系統。操作系統規定了計算機的運行方式和處理請求的方式,是計算機不可分割的一部分。在操作系統安裝時,安裝程序會為計算機安裝一個文件系統。文件系統與操作系統類似,都相當于一個程序,存在于存儲設備上,但文件系統用于規定文件的存取和操作方式。存儲設備的正常使用離不開文件系統,本章將會結合磁盤結構對文件系統和Linux系統中的文件進行講解。
5.1磁盤與目錄
磁盤是文件系統的底層支持,目錄是文件系統的具體表現,磁盤與目錄都和文件系統密不可分。本節先對磁盤的結構進行講解,再講解目錄結構(即文件的組織方式),以及存取文件時涉及的關鍵結構——inode和dentry。
5.1.1磁盤與磁盤分區
磁盤是計算機中的主要存儲設備,一般由主軸、盤片和讀寫磁頭組成,如圖51所示。磁盤中包含多張盤片,每張盤片包含上下兩個盤面,盤片固定在磁盤的主軸上,盤片的每個盤面都有一個固定在動臂上的讀寫磁頭;計算機中的數據存儲在磁盤的盤面上,盤片隨主軸的旋轉而轉動,固定在動臂上的讀寫磁頭在盤片轉動的同時讀取盤面上存儲的信息。
圖51磁盤結構示意圖
磁盤的盤片又可細分: 圖51中盤片上的圓環稱為磁道,每張盤片上有許多磁道。多張盤片上半徑相同的磁道組成的圓柱面稱為柱面,一張盤片有多少磁道,磁盤就有多少柱面。磁道是讀寫磁頭讀寫的軌跡,讀寫磁頭可以在動臂的帶動下切換訪問的柱面。由內及外,扇區中的磁道逐漸增大。較大的磁道能夠存儲更多的數據,但因為磁道中能存儲的數據量不同,所以以磁道作為存儲單位顯然會為數據存儲帶來麻煩。
磁盤上的盤片被細分為多個大小相同的扇區,扇區是磁盤空間的基本單位。一般來說,一個扇區的大小為512字節。磁盤中第一個扇區非常重要,其中存儲了與磁盤正常使用相關的重要信息,分別為: 主引導記錄、磁盤分區表和魔數。第5章Linux文件系統與操作Linux編程基礎 主引導記錄(MBR,Master Boot Record)占用446個字節,其中包含一段被稱為引導加載流程(Boot Loader)的程序。計算機啟動后,會到磁盤0扇面的0扇區去讀取MBR中的內容,只有MBR中的程序正確無誤,計算機才能正常開機。
磁盤分區表(partition table)占用64個字節,其中記錄整塊磁盤的分區狀態。每個分區的信息需要16個字節,因此磁盤分區表若只記錄分區信息,便最多只能存儲4個分區的分區信息。
魔數(magic number)占用兩個字節,用來標識MBR是否有效。
在計算機誕生伊始,其存儲空間是極其有限的,但隨著計算機硬件與軟件的發展,普通計算機中配備磁盤的存儲空間已能用T來計算,這表示磁盤中能夠存儲的數據也有了極大的提升。為了更好地組織文件,并提高磁盤的讀寫效率,為磁盤分區是一個明智的選擇。
若要為現實中的空間分區,如為一間房間分區,可以通過在房間中添加格檔來實現,但對于磁盤來說,這種方法顯然行不通。在對磁盤結構分區時,我們提到,磁盤的第一個扇區中存儲著一張“磁盤分區表”,其實利用這張表便能為磁盤分區。
磁盤由若干個柱面組成,假設一個磁盤有500個柱面,將磁盤分為4個扇區,那么只需要將磁盤的分區信息記錄在磁盤分區表中即可。按上述方式,磁盤分區與分區表的關系應如圖52所示(每個分區的柱面數可不相同)。
圖52分區表與磁盤分區
Linux系統中遵循“一切皆文件”的思想,Linux下的設備也會被視為文件。硬盤作為設備的一種,其對應的文件被存儲于系統的/dev目錄下。若磁盤為SATA類型,則磁盤路徑名為/dev/sda,圖52所示的四個分區在/dev目錄下對應的文件名如下所示:
P1: /dev/sda1
P2: /dev/sda2
P3: /dev/sda3
P4: /dev/sda4
設備的文件名由路徑、設備名與分區編號構成,若要在P2分區中存儲數據,則相應的數據會被寫到磁盤中編號為101~200的磁道上。
Linux和Windows系統中磁盤分區的方式是相同的,也就是說Windows系統中也有一個64字節的分區表。前文講到,分區表中最多只能記錄4個分區的屬性信息,但是熟悉Windows系統的用戶應該知道,Windows系統中可以有不止4個分區,這是為什么呢?
原來磁盤除可以劃分出主分區外,還可以劃分出一個擴展分區,而擴展分區可以再次劃分,由擴展分區劃分出的分區被稱為邏輯分區。邏輯分區中的信息同樣需要存儲,通常這些信息會被存儲在由擴展分區劃分出的第一個邏輯分區的第一個扇區中。
若磁盤中包含500個磁道,磁盤被分為一個主分區和一個擴展分區,且擴展分區又被劃分為4個邏輯分區,那么主分區表和邏輯分區表中的分區與磁盤的對應關系如圖53所示。
圖53主分區與邏輯分區
圖53的磁盤中有兩個分區表(分別用黑色扇形和方塊表示)。存在于分區P1中的分區表為主分區表,共占64字節,其中只記錄了兩個分區: P1和P2。分區P1為主分區,分區P2為擴展分區,分區P2又被劃分為4個邏輯分區L1~L4,其分區信息存儲于第101個柱面的扇區中。若Linux系統按圖53所示的方式分區,/dev目錄下將會有6個設備文件,文件的路徑名分別如下:
P1: /dev/sda1
P2: /dev/sda2
L1: /dev/sda5
L2: /dev/sda6
L3: /dev/sda7
L4: /dev/sda8
……