新闻详情

新闻详情

首页 / 资讯中心 / 详情

Coursebook C错误处理指南:系统调用失败如何优雅处理

发布时间:2026/10/3 12:42:32来源:尧图网络
Coursebook C错误处理指南:系统调用失败如何优雅处理
Coursebook C错误处理指南系统调用失败如何优雅处理【免费下载链接】coursebookOpen Source Introductory Systems Programming Textbook for the University of Illinois项目地址: https://gitcode.com/GitHub_Trending/co/coursebookCoursebook 是一本由伊利诺伊大学厄巴纳-香槟分校UIUCCS 341 系统编程课程使用的开源入门系统编程教材全书以 C 语言和 Linux 为核心。本文从教材中提取「错误处理」的核心内容带你快速掌握 C 语言中系统调用失败后如何用errno、strerror、perror优雅处理的完整方法帮助新手写出健壮的底层程序。1. 为什么 C 没有异常先记住三条基本规则很多新手从 Java 或 C 转来时习惯try/catch但在 C 的世界里错误处理走的是另一条路。教材在「Handling Errors」一节开宗明义大多数 C 函数通过返回值报告错误而不是抛出异常。这源于对 FORTRAN 等早期语言向后兼容的历史选择。理解 C 错误处理先记住三条规则规则说明① 检查返回值系统调用失败通常返回-1库函数如fopen失败返回NULL② 检查全局变量errno只有失败时才有效记录「为什么失败」③ 查 man page每个函数的错误码行为必须查手册man -S2 open确认教材特别强调errno是线程局部的它被存放在每个线程栈的顶端因此多线程程序中每个线程都有自己独立的一份errno副本不会被其他线程覆盖。2. errno strerror 组合系统调用失败的标准姿势教材给出的最经典范例就是打开一个不存在的文件。核心套路只有三步判断返回值 → 读取 errno → 翻译成人类可读的文字。#include errno.h FILE *f fopen(/does/not/exist.txt, r); if (NULL f) { fprintf(stderr, Errno is %d\n, errno); // 错误码数字 fprintf(stderr, Description is %s\n, strerror(errno)); // 英文描述 }两个高频错误码新手必须认识ENOENTNo such file or directory文件不存在open/fopen最常见的失败原因ENOMEMOut of memory内存不足malloc失败时的标准错误码完整原文可参考教材 introc/common_c_functions.tex 的「Handling Errors」小节。3. perror 快速诊断 直接返回错误码的函数调试阶段教材推荐用perror一步到位——它直接把errno的英文描述打印到标准错误流int ret open(IDoNotExist.txt, O_RDONLY); if (ret 0) { perror(Opening IDoNotExist:); }⚠️进阶提醒并非所有函数都走errno惯例有些库函数如getnameinfo会把错误码直接放进返回值。这类函数要配合专属翻译函数例如int s getnameinfo(...); if (0 ! s) { fprintf(stderr, getnameinfo: %s\n, gai_strerror(s)); }判断依据只有一个翻 man page 的返回值说明。详见 introc/common_c_functions.tex。4. 一键集中报错fail() QUIT 宏模式当程序里有十几处系统调用都要检查时逐个写if fprintf会非常啰嗦。教材在mmap一节给出了工程化的「一键集中处理」模式int fail(char *filename, int linenumber) { fprintf(stderr, %s:%d %s\n, filename, linenumber, strerror(errno)); exit(1); } #define QUIT fail(__FILE__, __LINE__)之后任何检查失败只需写一句if (addr (void*)-1) QUIT;自动打印文件名 行号 错误描述后退出排错效率极高。这个宏也适用于内存分配场景。注意教材附录特别指出malloc/calloc/realloc标准上要求失败时把errno置为ENOMEM但部分 malloc 实现并不会设置errno——所以判断malloc失败最可靠的方式是检查返回值是否为NULL而不是依赖errno。完整示例见 filesystems/filesystems.tex。5. 网络与并发场景区分「真错误」和「被打断」写网络程序时新手最容易踩的坑是把瞬态状态当成致命错误。教材 networking 章明确说明对非阻塞 socket 执行read()/write()时如果返回-1且errno是EAGAIN或EWOULDBLOCK只表示「暂时没数据/发不出去」稍后重试即可绝不该直接退出。另一个高频错误码是EINTR被信号中断。教材复习章给出的标准处理范式write返回-1时立即返回 -1除非errno是EINTR——此时应重复上一次 write配合「补发剩余数据」的循环write_all模式才能应对只写出部分字节的情况详见 networking/networking.tex 与 review/review.tex。6. 常见错误处理陷阱清单 ✅陷阱后果正确做法不检查系统调用返回值错误静默传播越查越难每个系统调用后都检查返回值成功时也读errnoerrno只在失败时有效可能读到脏数据仅在返回值表明失败后读errno用errno判断malloc失败部分实现不设置errno检查返回值是否为NULL把EAGAIN/EINTR当致命错误程序过早退出按瞬态状态重试忘记查 man page用错错误码判断函数如getnameinfo先确认函数遵循哪种错误惯例延伸学习路径想系统掌握这些内容建议按教材章节顺序阅读——先读 introc/introc.tex 的 C 语言基础再看 processes/processes.tex 中fork失败后检查errno的实例最后通读 appendix/appendix.tex 中关于malloc与errno的标准行为说明即可构建完整的 C 错误处理知识体系。【免费下载链接】coursebookOpen Source Introductory Systems Programming Textbook for the University of Illinois项目地址: https://gitcode.com/GitHub_Trending/co/coursebook创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

中望3D钣金:轮廓凸缘 2026/10/3 12:52:02

中望3D钣金:轮廓凸缘

首先创建一个基体平板,然后选择要创建非标准造型法兰的边。单击“编辑轮廓”按钮

阅读更多 →
苹果Mac电脑玩我的世界没有版本?用PCL-R即可! 2026/10/3 12:51:30

苹果Mac电脑玩我的世界没有版本?用PCL-R即可!

玩《我的世界》的 Mac 用户应该都懂这个痛点:PCL2 启动器原生只支持 Windows,官方没有 Mac 版本。 网上方案翻遍了,无非几种: 装 Parallels / VMware 虚拟机,开销巨大,M 芯片 Mac 发热严重、掉帧&#xff…

阅读更多 →
中望3D钣金:拉伸凸缘 2026/10/3 12:51:23

中望3D钣金:拉伸凸缘

该命令通过草图创建凸缘(支持开放和闭合草图)1.创建一个开放草图2.拉伸凸缘注意:若草图已有半径,半径选项将不生效.带闭合草图轮廓的拉伸凸缘注意:如果切口点是空白的,那么它将创建一个不能展开的封闭形状 …

阅读更多 →
LeetCode.1047.删除字符串中的所有相邻重复项 2026/10/3 12:50:05

LeetCode.1047.删除字符串中的所有相邻重复项

题目给出由小写字母组成的字符串 s,重复项删除操作 会选择两个相邻且相同的字母,并删除它们。在 s 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。就是用栈去遍历,碰上…

阅读更多 →
html学习第二天 2026/10/3 12:50:05

html学习第二天

1.ctrl shift /- 使vscode界面扩大/缩小 相对路径:相对于当前位置 2.本地绝对路径:src“E:/demo1/demo2/xxx.jpg” 3.网络绝对路径:src“图片地址,例如: https://i-blog.csdnimg.cn/direct/e7ea10edf06c4907a2ae713e0…

阅读更多 →
LeetCode.020.有效的括号 2026/10/3 12:49:18

LeetCode.020.有效的括号

题目给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉