Linux系统编程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

Preface
前言

Linux系统编程是指为Linux操作系统开发系统程序。Linux是世界上最流行的开源操作系统,它可以运行在所有设备上——从大型服务器到小型物联网(IoT)设备。了解如何为Linux编写系统程序将使你能够扩展操作系统,并将其与其他程序和系统相连接。

我们首先介绍如何使程序易于脚本化,并易于与其他程序交互。当我们为Linux编写系统程序时,应该始终努力使它们变小,同时使它们只做一件事,并且将这件事做好。这是Linux中的关键概念之一:创建能够以简单方式与其他程序进行数据交换的小程序。

随着学习的不断深入,我们将深入研究C语言,并了解编译器是如何工作的、链接器是做什么的、如何编写Makefile,等等。

我们将学习所有关于创建进程和守护进程的知识。我们还将创建自己的守护进程,并将守护进程置于systemd的控制之下。这将让我们能够使用内置的Linux工具启动、停止和重启守护进程。

我们还将学习如何使用不同类型的进程间通信(IPC)使进程进行信息交换;并了解如何编写线程化程序。

在本书的最后,我们将介绍如何使用GNU调试器(GDB)和Valgrind调试程序。

最终,你将能够为Linux编写各种各样的系统程序——从过滤器到守护进程。

目标读者

本书是为那些想为Linux开发系统程序,并想深入了解Linux系统的人准备的。任何遇到了与Linux系统编程的特定部分相关的问题,并且正在寻找一些特定的范例或解决方案的人,都可以从本书获益。

本书内容

第1章向你展示如何安装本书中所需的工具。同时,在该章中,我们还编写了第一个程序。

第2章介绍我们应该如何(以及为什么)使程序易于脚本化,并易于被系统上的其他程序所使用。

第3章带领我们深入了解Linux中C编程的内部工作原理。我们将学习如何使用系统调用、编译器的工作原理、如何使用Make工具、如何指定不同的C标准,等等。

第4章向我们展示如何优雅地处理错误。

第5章介绍如何使用文件描述符和流来进行文件的读取和写入。该章还介绍了如何使用系统调用来创建和删除文件以及读取文件权限。

第6章介绍如何创建进程、如何创建守护进程、什么是父进程,以及如何将作业发送到后台和前台。

第7章向我们展示如何将守护进程置于systemd的控制之下。该章还教我们如何将日志写入systemd的日志以及如何读取这些日志。

第8章向我们展示什么是共享库、为什么它们很重要,以及如何创建自己的共享库。

第9章介绍如何以不同的方式修改终端,例如,如何禁用密码提示的回显。

第10章介绍关于IPC的内容,即如何使进程在系统上相互通信,内容包括FIFO、UNIX套接字、消息队列、管道和共享内存。

第11章解释什么是线程、如何编写线程化程序、如何避免竞态条件,以及如何优化线程化程序。

第12章介绍使用GDB和Valgrind进行调试。

充分利用本书

为了充分利用本书,你需要对Linux有一些基本的了解:了解一些基本的命令、熟悉文件系统的运行、学会安装一些新的程序。如果你对编程(尤其是C语言)也有一些基本的了解,那么将更有帮助。

你需要一台具有root访问权限的Linux计算机(通过su或sudo)才能完成所有的范例。你还需要安装GCC编译器、Make工具、GDB、Valgrind以及一些其他的小工具。关于Linux发行版本,这并不重要。本书提供了关于这些程序在Debian、Ubuntu、CentOS、Fedora和Red Hat发行版本中的安装说明。

如果你使用的是本书的数字版本,我们建议你自己键入代码或者通过GitHub存储库访问代码(下一节提供链接)。这样做将帮助你避免与复制粘贴代码相关的任何潜在错误。

下载示例代码文件

你可以从GitHub下载本书的示例代码文件,下载路径为:https://GitHub.com/PacktPublishing/Linux-System-Programming-technologies。如果代码有更新,现有的GitHub存储库中的代码也将进行更新。

我们还提供了其他的代码包,包括丰富的书籍和视频:https://github.com/PacktPublishing/。可以看看他们!

代码动画视频

可以通过以下链接,以动画视频的方式查看本书代码:https://bit.ly/39ovGd6。

下载彩色图像

我们还提供了一个PDF文件,其中包含了本书中使用到的屏幕截图、图表的彩色图像。你可以在这里下载:http://www.packtpub.com/sites/default/ files/downloads/9781789951288_ColorImages.pdf。

本书约定

本书中使用了以下文本约定。

文本中的代码:表示文本中的代码字、目录、文件名、文件扩展名、路径名、虚拟URL、用户输入等。下面是一个示例:“将libprime.so.1文件复制到/usr/local/lib。”

代码块如下所示:

当我们想提醒你注意代码块的特定部分时,相关行或条目会以粗体显示:

任何命令行输入或输出都以如下方式书写:

在编号列表中,命令行输入以粗体显示。$>字符表示提示,并非你应该编写的内容。

1.这是一个编号列表的示例:

不适合单行的长命令行将使用\字符分隔。这与你在Linux shell中用来打断长行的字符是相同的。这一行的下面有一个>字符,表示该行是前一行的延续。>字符不是你应该编写的内容。当最后一行用\字符分隔时,Linux shell将自动把此字符添加在新行上。例如:

组合键用斜体书写。这里展示了一个示例:“按Ctrl+C退出程序。”

粗体:表示一个新术语、一个重要的单词,或者你在屏幕上看到的单词。

提示或重要说明

展示方式看起来像这样。

小节安排

在本书中,你会发现几个经常出现的标题(准备工作、实践步骤、它是如何工作的、更多,以及参考)。

准备工作

该节会告诉你范例的内容,并介绍如何设置该范例所需的任何软件或任何初步设置。

实践步骤

该节包含实现范例所需的步骤。

它是如何工作的

该节通常包含对上一节内容的详细解释。

更多

该节包含关于范例的附加信息,以便使你更加了解范例。

参考

该节提供了关于范例的其他有用信息的链接。