第 93 / 120 课 · 应用开发与部署。返回课程合集。
机制与资源关系
配置必须定义类型、范围和默认值,错误输入应在资源申请前拒绝。日志要包含阶段、对象、错误码和时间,不能只有“failed”。异常分支与正常退出一样需要释放已获取资源。
实际用法与观察入口
以下是操作说明;先确认执行环境、工具帮助和目标对象。设备名、PID、地址及项目名示例需要按实际替换,不能将整段命令当通用板端脚本执行。
|
输出解读与排查顺序
保存 errno 后再做可能改变它的调用;pthread 等接口则按各自返回约定处理。避免打印密码和大块原始视频;热路径日志应有等级、采样或限速。
情境推演
用户传入 16junk,atoi 可能只解析前缀,应用误认为有效配置。严格解析应检查结束位置、范围和溢出;错误消息包含字段名与允许范围,避免随后申请错误尺寸缓冲。
练习与参考分析
验证整数参数拒绝负数、尾随字符和溢出。参考结论:atoi 无法完整区分非法输入与合法零值,应使用可检查范围与结束位置的解析方式。
独立实验包
主机 Linux 的有界 C 实验;不访问真实外设,不代表板端时序或性能。 默认入口、源文件和实际运行记录都在下载包中。
实验:配置、日志与错误处理
查看完整代码:main.c
static int parse_count(const char *text, int *out) {
if (text[0] < '0' || text[0] > '9') return -1;
errno=0; char *end=NULL; long value=strtol(text,&end,10);
if (errno == ERANGE || *end != '\0' || value < 1 || value > 1024) return -1;
*out=(int)value; return 0;
}
int main(void) {
int count=0;
CHECK(parse_count("16",&count) == 0 && count == 16);
const char *bad[]={"", "0", "-1", "16junk", "1025", "999999999999999999999999999"};
for (size_t i=0;i<sizeof(bad)/sizeof(bad[0]);++i) CHECK(parse_count(bad[i],&count) == -1);
puts("valid=16; empty, zero, negative, suffix, bound and overflow rejected");
return 0;
}
在项目根目录执行;下载包解压后,在解压目录执行 sh run.sh。
cd 'content/posts/驱动、bootloader、文件系统/嵌入式Linux系统工程/093-配置、日志与错误处理/code' && sh run.sh
官方资料与版本边界
内核、工具和厂商 BSP 的支持范围需分别核对。参考资料可能对应较新版本;不要据此推定旧 BSP 支持所有接口。