图书前言

前    言

现代软件堆栈的规模和复杂性迅速发展。云、网络、数据科学、机器学习(ML)、开发运营一体化(DevOps)、容器、物联网(IoT)、嵌入式系统、分布式账本、虚拟现实(VR)和增强现实(AR)以及人工智能(AI)等技术领域不断发展和专业化,导致能够构建系统基础设施组件的系统软件开发人员严重短缺。

现代社会、企业和政府越来越依赖数字技术,因此更加重视开发安全、可靠和高效的系统软件和软件基础设施,以构建现代Web和移动应用程序。

数十年来,C和C++等系统编程语言在该领域证明了自己的实力,并提供了高度灵活的控制和性能,但这是以牺牲内存安全为代价的。

Java、C#、Python、Ruby和JavaScript等高级语言提供了内存安全,但对内存布局的控制较少,并且会受垃圾收集暂停的影响。

Rust是一种现代开源系统编程语言,它承诺并做到了3个领域的最佳:Java的类型安全;C++的速度、表现力和效率;无须垃圾收集器的内存安全。

本书采用了独特的三步法来教授Rust系统编程。本书的每一章都首先概述了类UNIX 操作系统(UNIX、Linux、macOS)中该主题的系统编程基础和Kernel系统调用,然后通过丰富的代码片段演示如何使用Rust标准库执行常见的系统调用(有些用例会用到外部Crate),再通过构建实际示例项目来强化这些知识的掌握。

通读完本书,你会对如何使用Rust管理和控制操作系统资源(如内存、文件、进程、线程、系统环境、外围设备、网络接口、终端和外壳程序)有清晰的了解,并掌握如何通过FFI构建跨语言绑定。在此过程中,你会对Rust为构建安全、高性能、可靠和高效的系统级软件带来的价值有深刻的认识。

本书读者

本书面向具有Rust基础知识但系统编程经验较少的程序开发人员,也适用于具有系统编程背景并将Rust视为C或C++替代品的人。

读者应该对C、C++、Java、Python、Ruby、JavaScript或Go语言的编程概念有基本的了解。

 

内容介绍

本书共分为3篇12章,具体内容如下。

第1篇:Rust系统编程入门,包括第1~4章。

第1章“Rust 工具链和项目结构”,介绍用于构建和管理依赖项、自动化测试和生成项目文档的Rust工具链。

第2章“Rust 编程语言之旅”,通过一个示例项目说明Rust编程语言的关键概念,包括类型系统、数据结构和内存管理基础。

第3章“Rust 标准库介绍”,详细讨论Rust标准库的关键模块,这些模块为Rust中的系统编程提供构建块和预定义功能。

第4章“管理环境、命令行和时间”,讨论如何以编程方式处理命令行参数、设置和操作进程环境,以及使用系统时间。

第2篇:在Rust中管理和控制系统资源,包括第5~9章。

第5章“Rust中的内存管理”,全面介绍Rust提供的内存管理工具,阐释   Linux内存管理的基础知识、C/C++的传统缺点,以及如何使用Rust来克服这些缺点。

第6章“在Rust中使用文件和目录”,介绍Linux文件系统的工作方式,以及如何在Rust中执行文件I/O操作,并提供一个在Rust中编写shell命令的项目示例。

第7章“在Rust中实现终端 I/O”,介绍伪终端应用程序的工作方式,以及如何创建这样一个程序。本章的项目示例是一个处理流的交互式应用程序。

第8章“处理进程和信号”,详细解释什么是进程、如何在Rust中处理进程、如何创建子进程并与子进程通信,以及如何处理信号和错误等。

第9章“管理并发”,阐释并发、并行和多线程的基础知识,以及在Rust中跨线程共享数据的各种机制,包括通道、互斥锁和引用计数器。

第3篇:高级主题,包括第10~12章。

第10章“处理设备I/O”,解释Linux中设备I/O的概念,如缓冲、标准输入和输出,以及设备I/O,并演示如何使用Rust控制I/O操作。

第11章“学习网络编程”,详细阐释Rust标准库中的低级网络原语和协议,并提供构建低级TCP和UDP服务器、客户端及TCP反向代理的项目示例。

第12章“编写不安全Rust和FFI”,描述与不安全Rust相关的主要机制和风险,并演示如何使用FFI将Rust与其他编程语言安全地连接起来。

充分利用本书

使用本书前,必须将Rustup安装在本地开发环境中。其网址如下:

https://github.com/rust-lang/rustup

官方安装说明网址如下:

https://www.rust-lang.org/tools/install

安装完成后,可使用以下命令检查rustc和cargo是否安装正确:

rustc --version

cargo –version

操作系统可使用Linux、macOS或Windows。

虽然Rust标准库在很大程度上是独立于平台的,但本书的总体风格是面向基于Linux/ UNIX系统的。因此,如果使用Windows系统,则在某些章节(或章节中的某些部分)中,建议使用本地Linux虚拟机,如Virtual box(也可以使用云虚拟机),这是因为部分示例代码和项目中使用的命令、外部Crate或共享库等可能是特定于Linux/UNIX系统的。

  注意:使用Windows系统进行开发的注意事项

有些章节需要运行类UNIX操作系统(UNIX/Linux/macOS)的虚拟机或Docker镜像。

本书每章有两种类型的代码,它们放置在本书配套的GitHub存储库中:

与示例项目相对应的代码(对应章节中的命名源文件)。

独立的代码片段,放置在每章的miscellaneous文件夹中。

建议开发人员通过本书配套的GitHub存储库(下文将提供链接)访问代码。这样做有助于避免与复制和粘贴代码相关的任何潜在错误。

在使用cargo run命令构建和运行Rust程序时,如果运行该命令的用户ID没有足够的权限来执行系统级操作(如读取或写入文件),则可能会收到“权限被拒绝”之类的消息。在这种情况下,解决方法之一是使用以下命令运行程序:

sudo env "PATH=$PATH" cargo run

 

下载示例代码文件

读者可以访问www.packtpub.com并通过个人账户下载本书的示例代码文件。具体步骤如下:

(1)注册并登录www.packtpub.com。

(2)在页面顶部的搜索框中输入图书名称Practical System Programming for Rust Developers(不区分大小写,也不必输入完整),即可看到本书出现在列表中,单击超链接,如图P-1所示。

 

图P-1  搜索图书

(3)在本书详情页面中,找到并单击Download code from GitHub(从GitHub中下载代码文件)按钮,如图P-2所示。

提示:如果看不到该下载按钮,可能是没有登录packtpub账号。该站点可免费注册账号。

(4)在本书GitHub源代码下载页面中,单击Code(代码)下拉按钮,在弹出的下拉菜单中选择Download ZIP(下载压缩包),如图P-3所示。

 

图P-2  单击下载代码的按钮

 

图P-3  下载GitHub存储库中的代码压缩包

下载文件后,请确保使用最新版本软件解压或析取文件夹:

WinRAR/7-Zip(Windows系统)。

Zipeg/iZip/UnRarX(macOS系统)。

7-Zip/PeaZip(Linux系统)。

你也可以直接访问本书在GitHub上的存储库,其网址如下:

https://github.com/PacktPublishing/Practical-System-Programming-for-Rust-Developers

如果代码有更新,则也会在现有GitHub存储库上更新。

  提示:

本书中的代码片段是为学习而设计的,因此可能并不满足生产环境中的要求。也就是说,虽然代码示例是实用的并且使用了地道的Rust语言,但它们并不以具有强大错误处理机制的全功能为目标,无法涵盖所有极端情况。这是有意为之,以免妨碍你的学习过程。

下载彩色图像

本书提供了一个PDF文件,其中包含本书中使用的屏幕截图和图表的彩色图像,可以通过以下地址下载:

http://www.packtpub.com/sites/default/files/downloads/9781800560963_ColorImages.pdf

本书约定

本书中使用了许多文本约定。

(1)有关代码块的设置如下所示:

fn main() {

println!("Hello, time now is {:}", chrono::Utc::now());

}

(2)当我们希望让你注意代码块的特定部分时,相关行或项目采用粗体表示,示例如下:

fn main() {

println!("Hello, time now is {:}", chrono::Utc::now());

}

(3)任何命令行输入或输出都采用如下所示的粗体代码形式:

cargo new Chapter2 && cd Chapter2

(4)术语或重要单词采用中英文对照形式给出,在括号内保留其英文原文,示例如下:

分词器或标记化器(tokenizer)是本项目系统设计中的一个模块,它从算术表达式中读取一个或多个字符并将其转换为一个标记(token)。换句话说,输入是一组字符,而输出则是一组标记。

(5)本书使用了以下两个图标:

 表示警告或重要的注意事项。

 表示提示或小技巧。