Linux是世界上最流行的開源操作系統(tǒng)。Linux系統(tǒng)編程技術(shù)將使你能夠使用自己的系統(tǒng)程序擴(kuò)展Linux操作 系統(tǒng),并與系統(tǒng)上的其他程序進(jìn)行通信。
本書探討了Linux文件系統(tǒng)及其基本命令、內(nèi)置手冊頁、GNU編譯器集合(GCC)和Linux系統(tǒng)調(diào)用;講述了如何處理程序中的錯(cuò)誤,以及如何捕獲錯(cuò)誤并打印錯(cuò)誤相關(guān)信息;介紹了在系統(tǒng)上讀寫文件的多種方法,包括使用流和文件描述符。隨著學(xué)習(xí)的不斷深入,你將深入研究創(chuàng)建進(jìn)程、創(chuàng)建僵尸進(jìn)程和守護(hù)進(jìn)程,并學(xué)習(xí)使用systemd處理守護(hù)進(jìn)程的方法;了解如何創(chuàng)建共享庫,并探索不同類型的進(jìn)程間通信(IPC);還將學(xué)習(xí)如何使用POSIX線程編寫程序,以及如何使用GNU調(diào)試器(GDB)和Valgrind調(diào)試程序。
學(xué)完本書,你將能夠在Linux系統(tǒng)中開發(fā)自己的系統(tǒng)程序,包括守護(hù)進(jìn)程、工具、客戶端和過濾器。
通過閱讀本書,你將:
◎ 了解如何使用各種系統(tǒng)調(diào)用為Linux系統(tǒng)編寫程序。
◎ 深入研究POSIX函數(shù)的工作原理。
◎ 理解并學(xué)會使用信號、管道、IPC和流程管理等關(guān)鍵概念。
◎ 了解如何集成程序與Linux系統(tǒng)。
◎ 探索高級主題,例如,文件系統(tǒng)操作、創(chuàng)建共享庫和調(diào)試程序。
◎ 全面了解如何使用Valgrind調(diào)試程序。
Linux是世界上最流行的開源操作系統(tǒng)。Linux系統(tǒng)編程技術(shù)將使你能夠使用自己的系統(tǒng)程序擴(kuò)展Linux操作系統(tǒng),并與系統(tǒng)上的其他程序進(jìn)行通信。 本書首先探討了Linux文件系統(tǒng)及其基本命令、內(nèi)置手冊頁、GNU編譯器集合(GCC)和Linux系統(tǒng)調(diào)用。然后,你將了解如何處理程序中的錯(cuò)誤,并學(xué)習(xí)如何捕獲錯(cuò)誤并打印錯(cuò)誤相關(guān)信息。本書介紹了在系統(tǒng)上讀寫文件的多種方法,包括使用流和文件描述符。隨著學(xué)習(xí)的不斷深入,你將深入研究創(chuàng)建進(jìn)程、創(chuàng)建僵尸進(jìn)程和守護(hù)程序,并學(xué)習(xí)使用systemd處理守護(hù)程序的方法。之后,你將了解如何創(chuàng)建共享庫,并探索不同類型的進(jìn)程間通信(IPC)。在后續(xù)的章節(jié)中,你還將學(xué)習(xí)如何使用POSIX線程編寫程序,以及如何使用GNU調(diào)試器(GDB)和Valgrind調(diào)試程序。 學(xué)完本書后,你將能夠在Linux系統(tǒng)中開發(fā)自己的系統(tǒng)程序,包括守護(hù)進(jìn)程、工具、客戶端和過濾器。 通過閱讀本書,你將: ?了解如何使用各種系統(tǒng)調(diào)用為Linux系統(tǒng)編寫程序。 ?深入研究POSIX函數(shù)的工作原理。 ?理解并學(xué)會使用信號、管道、IPC和流程管理等關(guān)鍵概念。 ?了解如何集成程序與Linux系統(tǒng)。 ?探索高級主題,例如,文件系統(tǒng)操作、創(chuàng)建共享庫和調(diào)試程序。 ?全面了解如何使用Valgrind調(diào)試程序。
Linux系統(tǒng)編程是指為Linux操作系統(tǒng)開發(fā)系統(tǒng)程序。Linux是世界上最流行的開源操作系統(tǒng),它可以運(yùn)行在所有設(shè)備上從大型服務(wù)器到小型物聯(lián)網(wǎng)(IoT)設(shè)備。了解如何為Linux編寫系統(tǒng)程序?qū)⑹鼓隳軌驍U(kuò)展操作系統(tǒng),并將其與其他程序和系統(tǒng)相連接。
我們首先介紹如何使程序易于腳本化,并易于與其他程序交互。當(dāng)我們?yōu)長inux編寫系統(tǒng)程序時(shí),應(yīng)該始終努力使它們變小,同時(shí)使它們只做一件事,并且將這件事做好。這是Linux中的關(guān)鍵概念之一:創(chuàng)建能夠以簡單方式與其他程序進(jìn)行數(shù)據(jù)交換的小程序。
隨著學(xué)習(xí)的不斷深入,我們將深入研究C語言,并了解編譯器是如何工作的、鏈接器是做什么的、如何編寫Makefile,等等。
我們將學(xué)習(xí)所有關(guān)于創(chuàng)建進(jìn)程和守護(hù)進(jìn)程的知識。我們還將創(chuàng)建自己的守護(hù)進(jìn)程,并將守護(hù)進(jìn)程置于systemd的控制之下。這將讓我們能夠使用內(nèi)置的Linux工具啟動、停止和重啟守護(hù)進(jìn)程。
我們還將學(xué)習(xí)如何使用不同類型的進(jìn)程間通信(IPC)使進(jìn)程進(jìn)行信息交換;并了解如何編寫線程化程序。
在本書的最后,我們將介紹如何使用GNU調(diào)試器(GDB)和Valgrind調(diào)試程序。
最終,你將能夠?yàn)長inux編寫各種各樣的系統(tǒng)程序從過濾器到守護(hù)進(jìn)程。
【目標(biāo)讀者】
本書是為那些想為Linux開發(fā)系統(tǒng)程序,并想深入了解Linux系統(tǒng)的人準(zhǔn)備的。任何遇到了與Linux系統(tǒng)編程的特定部分相關(guān)的問題,并且正在尋找一些特定的范例或解決方案的人,都可以從本書獲益。
【本書內(nèi)容】
第1章向你展示如何安裝本書中所需的工具。同時(shí),在該章中,我們還編寫了第一個(gè)
程序。
第2章介紹我們應(yīng)該如何(以及為什么)使程序易于腳本化,并易于被系統(tǒng)上的其他程序所使用。
第3章帶領(lǐng)我們深入了解Linux中C編程的內(nèi)部工作原理。我們將學(xué)習(xí)如何使用系統(tǒng)調(diào)用、編譯器的工作原理、如何使用Make工具、如何指定不同的C標(biāo)準(zhǔn),等等。
第4章向我們展示如何優(yōu)雅地處理錯(cuò)誤。
第5章介紹如何使用文件描述符和流來進(jìn)行文件的讀取和寫入。該章還介紹了如何使用系統(tǒng)調(diào)用來創(chuàng)建和刪除文件以及讀取文件權(quán)限。
第6章介紹如何創(chuàng)建進(jìn)程、如何創(chuàng)建守護(hù)進(jìn)程、什么是父進(jìn)程,以及如何將作業(yè)發(fā)送到后臺和前臺。
第7章向我們展示如何將守護(hù)進(jìn)程置于systemd的控制之下。該章還教我們?nèi)绾螌⑷罩緦懭雜ystemd的日志以及如何讀取這些日志。
第8章向我們展示什么是共享庫、為什么它們很重要,以及如何創(chuàng)建自己的共享庫。
第9章介紹如何以不同的方式修改終端,例如,如何禁用密碼提示的回顯。
第10章介紹關(guān)于IPC的內(nèi)容,即如何使進(jìn)程在系統(tǒng)上相互通信,內(nèi)容包括FIFO、UNIX套接字、消息隊(duì)列、管道和共享內(nèi)存。
第11章解釋什么是線程、如何編寫線程化程序、如何避免競態(tài)條件,以及如何優(yōu)化線程化程序。
第12章介紹使用GDB和Valgrind進(jìn)行調(diào)試。
【充分利用本書】
為了充分利用本書,你需要對Linux有一些基本的了解:了解一些基本的命令、熟悉文件系統(tǒng)的運(yùn)行、學(xué)會安裝一些新的程序。如果你對編程(尤其是C語言)也有一些基本的了解,那么將更有幫助。
你需要一臺具有root訪問權(quán)限的Linux計(jì)算機(jī)(通過su或sudo)才能完成所有的范例。你還需要安裝GCC編譯器、Make工具、GDB、Valgrind以及一些其他的小工具。關(guān)于Linux發(fā)行版本,這并不重要。本書提供了關(guān)于這些程序在Debian、Ubuntu、CentOS、Fedora和Red Hat發(fā)行版本中的安裝說明。
如果你使用的是本書的數(shù)字版本,我們建議你自己鍵入代碼或者通過GitHub存儲庫訪問代碼(下一節(jié)提供鏈接)。這樣做將幫助你避免與復(fù)制粘貼代碼相關(guān)的任何潛在錯(cuò)誤。
【下載示例代碼文件】
你可以從GitHub下載本書的示例代碼文件,下載路徑為:https://GitHub.com/PacktPublishing/
Linux-System-Programming-technologies。如果代碼有更新,現(xiàn)有的GitHub存儲庫中的代碼也將進(jìn)行更新。
我們還提供了其他的代碼包,包括豐富的書籍和視頻: https://github.com/PacktPublishing/?梢钥纯此麄!
【代碼動畫視頻】
可以通過以下鏈接,以動畫視頻的方式查看本書代碼:https://bit.ly/39ovGd6。
【下載彩色圖像】
我們還提供了一個(gè)PDF文件,其中包含了本書中使用到的屏幕截圖、圖表的彩色圖像。你可以在這里下載:http://www.packtpub.com/sites/default/ files/downloads/9781789951288_ColorImages.pdf。
Jack-Benny Persson是一位來自瑞典的技術(shù)顧問和作家。他撰寫了多本Linux和編程方面的書籍。他對Linux和其他類UNIX系統(tǒng)的熱情始于20年前的一個(gè)愛好。從那時(shí)起,他就把大部分業(yè)余時(shí)間都花在了閱讀Linux技術(shù)資料、完善Linux服務(wù)器以及撰寫Linux管理相關(guān)的書籍上。如今,他在瑞典擁有自己的IT和媒體公司,該公司主要聚焦于Linux技術(shù)。
第1章 獲取必要的工具并編寫
第一個(gè)Linux程序 1
1.1 技術(shù)要求 1
1.2 安裝GCC和GNU Make 2
1.2.1 準(zhǔn)備工作 3
1.2.2 實(shí)踐步驟 3
1.2.3 它是如何工作的 4
1.3 安裝GDB和Valgrind 5
1.3.1 準(zhǔn)備工作 5
1.3.2 實(shí)踐步驟 5
1.3.3 它是如何工作的 6
1.4 在Linux中編寫一個(gè)簡單的
C程序 7
1.4.1 準(zhǔn)備工作 7
1.4.2 實(shí)踐步驟 7
1.4.3 它是如何工作的 8
1.4.4 更多 9
1.5 編寫一個(gè)解析命令行選項(xiàng)
的程序 10
1.5.1 準(zhǔn)備工作 10
1.5.2 實(shí)踐步驟 10
1.5.3 它是如何工作的 12
1.6 在內(nèi)置手冊頁中查找信息 13
1.6.1 準(zhǔn)備工作 13
1.6.2 實(shí)踐步驟 14
1.6.3 它是如何工作的 14
1.6.4 更多 15
1.7 搜索手冊以獲取信息 15
1.7.1 準(zhǔn)備工作 15
1.7.2 實(shí)踐步驟 15
1.7.3 它是如何工作的 15
1.7.4 更多 16
第2章 使你的程序易于腳本化 17
2.1 技術(shù)要求 18
2.2 返回值以及如何讀取它們 18
2.2.1 準(zhǔn)備工作 18
2.2.2 實(shí)踐步驟 18
2.2.3 它是如何工作的 20
2.2.4 更多 21
2.2.5 參考 21
2.3 使用有意義的返回值退出程序 21
2.3.1 準(zhǔn)備工作 21
2.3.2 實(shí)踐步驟 21
2.3.3 它是如何工作的 24
2.3.4 更多 25
2.4 重定向標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出
和標(biāo)準(zhǔn)錯(cuò)誤 25
2.4.1 準(zhǔn)備工作 25
2.4.2 實(shí)踐步驟 25
2.4.3 它是如何工作的 27
2.4.4 更多 28
2.5 使用管道連接程序 28
2.5.1 準(zhǔn)備工作 28
2.5.2 實(shí)踐步驟 28
2.5.3 它是如何工作的 29
2.5.4 更多 30
2.5.5 參考 30
2.6 寫入標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤 30
2.6.1 實(shí)踐步驟 30
2.6.2 它是如何工作的 32
2.6.3 更多 32
2.7 從標(biāo)準(zhǔn)輸入讀取 33
2.7.1 準(zhǔn)備工作 33
2.7.2 實(shí)踐步驟 33
2.7.3 它是如何工作的 34
2.7.4 更多 35
2.8 編寫一個(gè)管道友好的程序 36
2.8.1 準(zhǔn)備工作 36
2.8.2 實(shí)踐步驟 36
2.8.3 它是如何工作的 38
2.8.4 更多 39
2.9 將結(jié)果重定向到文件 39
2.9.1 準(zhǔn)備工作 40
2.9.2 實(shí)踐步驟 40
2.9.3 它是如何工作的 43
2.9.4 更多 44
2.10 讀取環(huán)境變量 44
2.10.1 準(zhǔn)備工作 44
2.10.2 實(shí)踐步驟 45
2.10.3 它是如何工作的 46
2.10.4 更多 47
第3章 深入探索Linux中的C語言 48
3.1 技術(shù)要求 49
3.2 使用GNU編譯器套件
鏈接庫 49
3.2.1 準(zhǔn)備工作 49
3.2.2 實(shí)踐步驟 49
3.2.3 它是如何工作的 52
3.2.4 更多 53
3.3 切換C標(biāo)準(zhǔn) 54
3.3.1 準(zhǔn)備工作 54
3.3.2 實(shí)踐步驟 54
3.3.3 它是如何工作的 56
3.3.4 更多 57
3.4 使用系統(tǒng)調(diào)用 57
3.4.1 準(zhǔn)備工作 58
3.4.2 實(shí)踐步驟 58
3.4.3 它是如何工作的 60
3.4.4 更多 61
3.5 獲取Linux和類UNIX頭
文件信息 61
3.5.1 準(zhǔn)備工作 61
3.5.2 實(shí)踐步驟 62
3.5.3 它是如何工作的 63
3.5.4 更多 63
3.6 定義功能測試宏 63
3.6.1 準(zhǔn)備工作 64
3.6.2 實(shí)踐步驟 64
3.6.3 它是如何工作的 67
3.6.4 更多 68
3.7 編譯過程的4個(gè)步驟 68
3.7.1 準(zhǔn)備工作 68
3.7.2 實(shí)踐步驟 68
3.7.3 它是如何工作的 71
3.8 使用Make編譯 72
3.8.1 準(zhǔn)備工作 72
3.8.2 實(shí)踐步驟 73
3.8.3 它是如何工作的 74
3.9 使用GCC選項(xiàng)編寫一個(gè)
通用的Makefile 74
3.9.1 準(zhǔn)備工作 74
3.9.2 實(shí)踐步驟 75
3.9.3 它是如何工作的 75
3.9.4 更多 75
3.10 編寫一個(gè)簡單的Make file 76
3.10.1 準(zhǔn)備工作 76
3.10.2 實(shí)踐步驟 76
3.10.3 它是如何工作的 77
3.11 編寫一個(gè)更高級的Makefile 77
3.11.1 準(zhǔn)備工作 78
3.11.2 實(shí)踐步驟 78
3.11.3 它是如何工作的 82
第4章 處理程序中的錯(cuò)誤 84
4.1 技術(shù)要求 85
4.2 為什么錯(cuò)誤處理在系統(tǒng)編程
中很重要 85
4.2.1 準(zhǔn)備工作 85
4.2.2 實(shí)踐步驟 85
4.2.3 它是如何工作的 87
4.3 處理常見的錯(cuò)誤 87
4.3.1 準(zhǔn)備工作 87
4.3.2 實(shí)踐步驟 88
4.3.3 它是如何工作的 90
4.4 錯(cuò)誤處理和errno 90
4.4.1 準(zhǔn)備工作 91
4.4.2 實(shí)踐步驟 91
4.4.3 它是如何工作的 92
4.5 處理更多errno宏 93
4.5.1 準(zhǔn)備工作 93
4.5.2 實(shí)踐步驟 93
4.5.3 它是如何工作的 94
4