
Fedora是基于RHEL,CentOS,Scientific Linux, 和Oracle Linux的社區(qū)版本。相比RHEL,F(xiàn)edora打包了顯著的更多的軟件包。其中一個原因是,多樣化的社區(qū)參與Fedora的建設(shè);它不只是一家公司。在這個過程中,CentOS用于活動,演示和實驗,因為它是對最終用戶免費提供的,并具有比Fedora的一個更長的發(fā)布周期(通常每隔半年左右發(fā)布一個新版本)。
該漏洞在 CVSS 3.0 下的基本得分為 7.8,它能夠讓本地無權(quán)限的用戶獲取 root 權(quán)限,或者發(fā)動 DoS 讓系統(tǒng)崩潰。4.10.1 以上的版本都存在這個問題,Linux 方面表示,該漏洞將影響 Linux 服務器,工作站以及虛擬機,但對大多數(shù)容器不造成影響。
本章前面幾節(jié)所述的文件及I/O讀寫都是基于文件描述符的。這些都是基本的I/O控制,是不帶緩存的。而本節(jié)所要討論的I/O操作都是基于流緩沖的,它是符合ANSI C的標準I/O處理,這里有很多函數(shù)讀者已經(jīng)非常熟悉了(如printf()、scantf()函數(shù)等),因此本節(jié)中僅簡要介紹最主要的函數(shù)。
通過編寫文件讀寫及上鎖的程序,進一步熟悉Linux中文件I/O相關(guān)的應用開發(fā),并且熟練掌握open()、read()、write()、fcntl()等函數(shù)的使用。
本書在第2章中介紹“ps”的命令時提到過管道,當時指出了管道是Linux中一種很重要的通信方式,它是把一個程序的輸出直接連接到另一個程序的輸入,這里仍以第2章中的“ps –ef | grep ntp”為例,描述管道的通信過程,如圖8.2所示
本章首先講解了系統(tǒng)調(diào)用(System Call)、用戶函數(shù)接口(API)和系統(tǒng)命令之間的聯(lián)系和區(qū)別,這也是貫穿本書的一條主線,本書就是按照系統(tǒng)命令、用戶函數(shù)接口(API)系統(tǒng)調(diào)用的順序逐層深入講解,希望讀者能有一個較為深刻的認識。
進程的概念首先是在20世紀60年代初期由MIT的Multics系統(tǒng)和IBM的TSS/360系統(tǒng)引入的。在40多年的發(fā)展中,人們對進程有過各種各樣的定義?,F(xiàn)列舉較為著名的幾種。
在Linux中創(chuàng)建一個新進程的惟一方法是使用fork()函數(shù)。fork()函數(shù)是Linux中一個非常重要的函數(shù),和讀者以往遇到的函數(shù)有一些區(qū)別,因為它看起來執(zhí)行一次卻返回兩個值。難道一個函數(shù)真的能返回兩個值嗎?希望讀者能認真地學習這一部分的內(nèi)容。
守護進程,也就是通常所說的Daemon進程,是Linux中的后臺服務進程。它是一個生存期較長的進程,通常獨立于控制終端并且周期性地執(zhí)行某種任務或等待處理某些發(fā)生的事件。守護進程常常在系統(tǒng)引導載入時啟動,在系統(tǒng)關(guān)閉時終止。
通過編寫多進程程序,使讀者熟練掌握fork()、exec()、wait()和waitpid()等函數(shù)的使用,進一步理解在Linux中多進程編程的步驟。
本章主要介紹進程的控制開發(fā),首先給出了進程的基本概念,Linux下進程的基本結(jié)構(gòu)、模式與類型以及Linux進程管理。進程是Linux中程序運行和資源管理的最小單位,對進程的處理也是嵌入式Linux應用編程的基礎(chǔ),因此,讀者一定要牢牢掌握。
信號是UNIX中所使用的進程通信的一種最古老的方法。它是在軟件層次上對中斷機制的一種模擬,是一種異步通信方式。信號可以直接進行用戶空間進程和內(nèi)核進程之間的交互,內(nèi)核進程也可以利用它來通知用戶空間進程發(fā)生了哪些系統(tǒng)事件。它可以在任何時候發(fā)給某一進程,而無需知道該進程的狀態(tài)。
在多任務操作系統(tǒng)環(huán)境下,多個進程會同時運行,并且一些進程之間可能存在一定的關(guān)聯(lián)。多個進程可能為了完成同一個任務會相互協(xié)作,這樣形成進程之間的同步關(guān)系。而且在不同進程之間,為了爭奪有限的系統(tǒng)資源(硬件或軟件資源)會進入競爭狀態(tài),這就是進程之間的互斥關(guān)系。
可以說,共享內(nèi)存是一種最為高效的進程間通信方式。因為進程可以直接讀寫內(nèi)存,不需要任何數(shù)據(jù)的復制。為了在多個進程間交換信息,內(nèi)核專門留出了一塊內(nèi)存區(qū)。這段內(nèi)存區(qū)可以由需要訪問的進程將其映射到自己的私有地址空間。因此,進程就可以直接讀寫這一內(nèi)存區(qū)而不需要進行數(shù)據(jù)的復制,從而大大提高了效率。
顧名思義,消息隊列就是一些消息的列表。用戶可以從消息隊列中添加消息和讀取消息等。從這點上看,消息隊列具有一定的FIFO特性,但是它可以實現(xiàn)消息的隨機查詢,比FIFO具有更大的優(yōu)勢。同時,這些消息又是存在于內(nèi)核中的,由“隊列ID”來標識。
通過編寫有名管道多路通信實驗,讀者可進一步掌握管道的創(chuàng)建、讀寫等操作,同時,也復習使用select()函數(shù)實現(xiàn)管道的通信。
本章詳細講解了Linux中進程間通信的幾種機制,包括管道通信、信號通信、消息隊列、信號量以及共享內(nèi)存機制等,并且講解了進程間通信的演進。
前面已經(jīng)提到,進程是系統(tǒng)中程序執(zhí)行和資源分配的基本單位。每個進程都擁有自己的數(shù)據(jù)段、代碼段和堆棧段,這就造成了進程在進行切換等操作時都需要有比較復雜的上下文切換等動作。為了進一步減少處理機的空轉(zhuǎn)時間,支持多處理器以及減少上下文切換開銷,進程在演化中出現(xiàn)了另一個概念——線程。
“生產(chǎn)者消費者”問題是一個著名的同時性編程問題的集合。通過學習經(jīng)典的“生產(chǎn)者消費者”問題的實驗,讀者可以進一步熟悉Linux中的多線程編程,并且掌握用信號量處理線程間的同步和互斥問題。
本章首先介紹了線程的基本概念、線程的分類和特性以及線程的發(fā)展歷程。