news 2026/7/19 8:22:02

《深入理解计算机系统》附录 B 错误处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《深入理解计算机系统》附录 B 错误处理

《深入理解计算机系统》(CSAPP)的附录B《错误处理》是一份非常实用的编程指南。它的核心是教你如何以一种简洁、统一的方式,来处理Unix/Linux系统编程中那些烦人但又至关重要的系统调用错误

核心知识点

附录B的内容主要围绕以下三个部分展开:

1. 为何需要统一的错误处理?
  • 错误难以避免:系统级函数(如fork,wait,pthread_create)的调用可能会因各种原因失败。
  • 错误风格混乱:不同函数返回错误的方式不同,导致错误处理代码冗长且容易出错。
  • 追求代码简洁:为了在书中保持示例代码的清晰,同时不省略错误检查,作者需要一种两全其美的方法。
2. 三大主流错误处理风格

附录B首先系统性地总结了三种常见的错误处理范式。

风格返回值(成功/失败)错误信息存放处典型函数
Unix风格成功返回有意义的值;失败返回-1全局变量errnofork,wait,kill
Posix风格成功返回0;失败返回非0的错误码返回值本身pthread_create
DNS/GAI风格成功返回0;失败返回非0的错误码全局变量h_errnogethostbyname
3. 错误处理包装函数 (Error-Handling Wrappers)

这是附录B的核心思想,也是全书广泛采用的实践。

  • 做法:为每个系统函数(如foo)定义一个同名的包装函数(Foo
  • 功能:包装函数内部调用原始函数并立即检查错误
    • 若有错误:打印错误信息并终止进程
    • 若无错误:像原函数一样返回。
  • 优势:让主代码保持简洁,同时确保了所有系统调用都经过了错误检查。
  • 实现:这些包装函数通常定义在csapp.c文件中,并通过csapp.h头文件暴露给程序使用。
4. 并非所有错误都是致命的

附录B也指出,包装函数并非万能。在信号处理程序等特殊场景中,错误可能并非致命,需要更精细的处理。

可能存在的问题与局限性

作为本书配套的实践指南,它也存在一些局限性:

  • 终止进程的策略过于强硬:包装函数遇到错误就终止进程,这在学习示例中没问题,但在生产环境中往往不可接受。一个健壮的程序可能需要重试、降级或进行清理工作,而非直接退出。
  • 可能与现代编程实践脱节
    • 错误处理演化:更现代的语言(如Rust、Go)或C++的异常机制,提供了比检查errno更丰富的错误处理范式。
    • 并发环境下的errno:在多线程程序中,errno已被定义为线程局部变量,但在附录B所基于的早期背景下,这一点可能未被强调。
  • 依赖特定的教学库csapp.ccsapp.h是本书的配套文件,这增加了学习者在脱离本书环境后,直接应用这些代码的迁移成本。

总结

附录B《错误处理》是CSAPP从“讲原理”到“教编程”的关键一环。它传授的**“封装变化”**思想——将容易出错、风格不一的系统调用,封装成统一、可靠的接口——是值得每一位系统程序员学习的设计模式。

它的价值不仅在于教会你检查errno,更在于启发你思考如何构建健壮、清晰的代码。理解其背后的思想,远比记住具体的代码实现更重要。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/19 8:21:13

Ubuntu 14.04编译Android 4.4.2源码实战指南

1. 项目背景与意义 在移动开发领域,编译Android源代码是一项极具挑战性又充满价值的工作。我最近在Ubuntu 14.04 LTS系统上成功编译了Android 4.4.2(KitKat)的完整源代码,整个过程耗时约36小时,遇到了不少值得分享的技…

作者头像 李华
网站建设 2026/7/19 8:20:46

Android NDK下FreeType库的交叉编译与中文渲染实践

1. 项目背景与需求分析在Android平台上实现高质量的文本渲染一直是个技术难点。虽然Android系统内部使用了FreeType库进行字体渲染,但并未向开发者开放相关接口。当我们需要在OpenCV、游戏引擎或其他原生代码中显示中文或复杂文字时,自行编译FreeType库就…

作者头像 李华
网站建设 2026/7/19 8:19:37

嵌入式PRCM寄存器深度解析:从电源时钟管理到低功耗实战

1. 从手册到实战:PRCM寄存器深度解析的价值如果你在嵌入式领域,特别是基于ARM Cortex-A系列或TI OMAP/AM系列处理器的项目里摸爬滚打过,那么“PRCM”这三个字母对你来说一定不陌生。它代表着Power, Reset, and Clock Management,即…

作者头像 李华
网站建设 2026/7/19 8:18:46

GTA5线上小助手终极指南:解锁洛圣都无限可能的完整工具集

GTA5线上小助手终极指南:解锁洛圣都无限可能的完整工具集 【免费下载链接】GTA5OnlineTools GTA5线上小助手 项目地址: https://gitcode.com/gh_mirrors/gt/GTA5OnlineTools 想要在GTA5线上模式中获得前所未有的自由度和个性化体验吗?GTA5线上小助…

作者头像 李华
网站建设 2026/7/19 8:17:59

苏州汽车零部件ERP,鼎捷和本地小厂商比,值得多花那些钱吗?

苏州汽车零部件ERP,鼎捷和本地小厂商比,值得多花那些钱吗? 苏州集聚大量中小型汽车零部件加工企业,普遍属于离散制造模式,不少工厂负责人在数字化选型时都会纠结:选成熟行业品牌ERP,还是本地小型…

作者头像 李华
网站建设 2026/7/19 8:16:39

深入解析AM62L调试子系统:ROM表、APBAP与AXIAP实战指南

1. 调试子系统:嵌入式开发的“后门”与“眼睛”在嵌入式系统开发,尤其是像AM62L这类复杂SoC的底层开发中,调试子系统(Debug Subsystem)的地位,就好比外科医生手中的内窥镜和手术刀。它不参与应用功能的正常…

作者头像 李华