这本书旨在为系统编程的基本方面提供现成的解决方案(给开发人员),尽可能使用最新的 C++ 标准。系统编程涉及构建与操作系统紧密交互的计算机程序,并允许计算机硬件与程序员和用户交互。由于其高效的特性,即低级计算、数据抽象和面向对象的特性,C++ 是系统编程的首选语言。您将学习如何创建健壮的并发系统,还将了解具有共享内存和管道的进程间通信机制。展望未来,您将深入研究 C++ 内置库和框架,以便根据您的需求设计健壮的系统。
这本书是为想获得系统编程实用知识的 C++ 开发人员准备的。虽然没有 Linux 系统编程的经验,但是中级的 C++ 知识是必要的。
第 1 章、系统编程入门、*、*向您介绍了一些基础知识,如学习外壳、用户和组、进程标识和线程标识,以便能够熟练使用 Linux 系统,等等,这些是您在本书剩余部分必须了解的。例如,您将了解 Linux 是如何设计的,外壳、用户和组、进程标识和线程标识。此外,您将学习如何开发一个简单的Hello World
程序,编写它的 makefile,执行它,并调试它。这些知识虽然是基本的,但对于后面章节中出现的更高级的主题来说是至关重要的。
第二章、重温 C++ 、T5】刷新你对 C++ 17 的理解,这将贯穿全书。它将展示为什么 C++ 代表了一个编写高质量代码的绝佳机会,这种代码比以往任何时候都更加简洁和可移植。本章包含了 C++ 11/17/20 引入的所有新特性,您会发现这些特性在本书中很有用。
第三章、处理进程和线程,向你介绍进程和线程,它们是任何阐述的基础。一个程序很少仅仅由一个过程组成。本章揭示了在 C++ 中处理线程和进程的技术。本章将展示与 POSIX 相比,处理线程(和任务)是多么容易和方便。虽然 C++ 没有创建过程的正式方式,但是很少有线程不能完成工作的情况。
第四章、*深度潜入内存管理,*给大家介绍内存,这是处理系统开发的核心概念之一。分配、释放和学习如何管理内存以及 C++ 可以提供什么来简化和管理内存至关重要。此外,本章还介绍了如何检查和分配对齐的内存以及如何处理内存映射的输入/输出
第 5 章、使用互斥体、信号量和条件变量、T5】向我们展示了 POSIX 机制解决方案和 C++ 提供的同步线程和进程的解决方案。
第 6 章、*管道、先进先出(FIFO)、消息队列和共享内存,*着重于使进程相互通信。有不同的解决方案——管道、先进先出、消息队列和共享内存。对于每个进程间通信机制,提供一个配方。
第 7 章、网络编程,演示了通信是如何从连接到结束的。不同机器上的进程之间的通信是当今互联网的基础,而 TCP/IP 是事实上的标准。将详细描述 TCP (传输控制协议的简称)和 UDP (用户数据报协议的简称,因为前者代表面向连接,后者代表面向无连接。这在当今非常重要,尤其是在线视频流服务。
第 8 章、处理控制台 I/O 和文件、T5】向您展示了处理文件、控制台 I/O 和字符串流的有用方法。
第 9 章、*处理时间接口、*通过 C++ 和 POSIX 提供的特性,让您深刻理解如何处理和测量时间。本章将提供每种方法的现成配方。
第 10 章、*管理信号,*向我们介绍了软件中断信号。它们提供了一种管理异步事件的方法。例如,用户从终端键入中断键,或者另一个进程发送必须管理的信号。每个信号都有一个以SIG
开头的名字(例如SIGABRT
)。本章将向读者展示如何编写代码来正确管理软件中断,Linux 为每个信号定义的默认操作是什么,以及如何覆盖它们。
第 11 章、*调度、*向您展示了如何使用 POSIX(c++ 标准没有提供这个)来设置调度器参数、调度器策略和调度器优先级。迄今为止,系统编程是关于与底层操作系统的交互。调度器是每个操作系统的主要组件之一,它影响进程在 CPU 上的分配方式。有些情况下,开发人员需要对此进行控制,或者至少试图影响调度程序。
以下是这本书的要求清单:
- C++ 中级知识。
- 任何额外的要求都在每章的技术要求部分提及。
- 免责声明:C++ 20 标准已由 WG21 在 2 月底布拉格的一次会议上批准(即技术上最终确定)。这意味着,本书使用的 GCC 编译器版本 8.3.0 不包括(或支持非常非常有限的)新的和酷的 C++ 20 特性。因此,Docker 映像不包括 C++ 20 配方代码。
GCC 保持分支机构最新功能的开发(你必须为此使用适当的标志,例如
-std=c++ 2a
);因此,鼓励你自己去试验它们。所以,克隆和探索 GCC 合同和模块分支,享受乐趣吧。 - 一些菜谱(尤其是在第 11 章、调度中)需要以管理员权限运行的 Docker 映像才能正确执行。根据您的 Docker 配置,您可能需要使用
sudo
运行 Docker。为了避免这种情况,您可以创建一个 Linux 组(例如,docker
)并向其中添加用户。
你可以从你在www.packt.com的账户下载这本书的示例代码文件。如果您在其他地方购买了这本书,您可以访问www.packtpub.com/support并注册将文件直接通过电子邮件发送给您。
您可以按照以下步骤下载代码文件:
- 登录或注册www.packt.com。
- 选择“支持”选项卡。
- 点击代码下载。
- 在搜索框中输入图书的名称,并按照屏幕指示进行操作。
下载文件后,请确保使用最新版本的解压缩文件夹:
- 视窗系统的 WinRAR/7-Zip
- zipeg/izp/un ARX for MAC
- 适用于 Linux 的 7-Zip/PeaZip
这本书的代码包也托管在 GitHub 上https://GitHub . com/PacktPublishing/C-System-Programming-cook book。如果代码有更新,它将在现有的 GitHub 存储库中更新。
我们还有来自丰富的图书和视频目录的其他代码包,可在**【https://github.com/PacktPublishing/】**获得。看看他们!
我们还提供了一个 PDF 文件,其中包含本书中使用的截图/图表的彩色图像。可以在这里下载:https://static . packt-cdn . com/downloads/9781838646554 _ color images . pdf。
请访问以下链接查看 CiA 视频:http://bit.ly/2uXftdA
本书通篇使用了许多文本约定。
CodeInText
:表示文本中的码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟网址、用户输入和推特句柄。这里有一个例子:“第二步,我们开始开发main
方法。”
代码块设置如下:
std::cout << "Start ... " << std::endl;
{
User* developer = new User();
developer->cheers();
delete developer;
}
当我们希望将您的注意力吸引到代码块的特定部分时,相关的行或项目以粗体显示:
auto* mapPtr = static_cast<T*> (mmap(0, sizeof(T) * n,
PROT_READ | PROT_WRITE,
任何命令行输入或输出都编写如下:
$ grep "text" filename
$ ls -l | grep filename
粗体:表示一个新的术语,一个重要的单词,或者你在屏幕上看到的单词。例如,菜单或对话框中的单词像这样出现在文本中。下面是一个示例:“从管理面板中选择系统信息。”
Warnings or important notes appear like this. Tips and tricks appear like this.
在这本书里,你会发现几个经常出现的标题(准备,怎么做...、它是如何工作的...、还有更多...和参见。
要给出如何完成配方的明确说明,请使用以下部分。
本节告诉您配方中的预期内容,并描述如何设置配方所需的任何软件或任何初步设置。
本节包含遵循配方所需的步骤。
这一部分通常包括对前一部分发生的事情的详细解释。
本节包含关于配方的附加信息,以便您更好地了解配方。
本节提供了该配方的其他有用信息的有用链接。
我们随时欢迎读者的反馈。
一般反馈:如果你对这本书的任何方面有疑问,在你的信息主题中提到书名,发邮件给我们customercare@packtpub.com
。
勘误表:虽然我们已经尽了最大的努力来保证内容的准确性,但是错误还是会发生。如果你在这本书里发现了一个错误,如果你能向我们报告,我们将不胜感激。请访问www.packtpub.com/support/errata,选择您的图书,点击勘误表提交链接,并输入详细信息。
盗版:如果您在互联网上遇到任何形式的我们作品的非法拷贝,如果您能提供我们的位置地址或网站名称,我们将不胜感激。请通过copyright@packt.com
联系我们,并提供材料链接。
如果你有兴趣成为一名作者:如果有一个你有专长的话题,你有兴趣写或者投稿一本书,请访问authors.packtpub.com。
请留下评论。一旦你阅读并使用了这本书,为什么不在你购买它的网站上留下评论呢?然后,潜在的读者可以看到并使用您不带偏见的意见来做出购买决定,我们在 Packt 可以了解您对我们产品的看法,我们的作者可以看到您对他们的书的反馈。谢谢大家!
更多关于 Packt 的信息,请访问packt.com。