RedHat7.9下dvd+rw-mediainfo退出码及相关定义查询
关于dvd+rw-mediainfo退出码的解决方案
问题背景
我在RedHat 7.9环境下,用Apache ProcBuilder或Java 11的ProcessBuilder封装dvd+rw-mediainfo工具查询光驱介质状态。目前已实测到:
- 251:光驱无光盘插入
- 130:指定驱动器不存在
需要了解该工具其他可能的退出码。
源码分析遇到的问题
查看dvd+rw-mediainfo.cpp源码时,找不到退出码的明确定义:
- 源码中使用
exit(FATAL_START(errno))和exit(FATAL_START(EINVAL)),但找不到FATAL_START的定义 - 不清楚
errno的设置位置,系统中也没找到疑似包含定义的stddef.h - 工具手册页未列出退出码相关信息,本人仅熟悉Java,对C++不擅长
可行的解决方案
1. 从完整源码包找宏定义
FATAL_START大概率定义在项目内部公共头文件中(比如同项目的cmdline.h或工具专属的通用头文件)。下载完整的dvd+rw-tools源码包,在整个目录下搜索#define FATAL_START,就能看到它的宏逻辑——通常这类宏会对标准错误码做固定偏移,以此生成工具专属退出码。
2. 实测覆盖错误场景收集退出码
直接手动触发各类可能的错误场景,执行命令后用echo $?获取退出码并记录:
- 插入不同类型介质(DVD-R、DVD+R、蓝光、损坏光盘等)
- 传入无效设备路径(比如
/dev/sdx这类不存在的设备) - 光驱弹出状态下执行命令
- 用无权限的普通用户执行命令
- 介质被其他进程占用时执行命令
3. 结合系统errno反推退出码
FATAL_START(errno)中的errno是标准C错误码,可通过man errno查看RedHat 7.9上的对应数值。如果FATAL_START是简单偏移宏(比如#define FATAL_START(x) (256 - x)),就能反推出对应退出码:比如EINVAL(无效参数)通常对应数值2,那退出码就是256-2=254,可手动验证该场景。
4. 反编译本地二进制文件分析
如果找不到完整源码,用工具分析本地安装的dvd+rw-mediainfo二进制:
- 执行
objdump -d /usr/bin/dvd+rw-mediainfo | grep exit,找到所有退出调用的位置 - 查看对应位置的立即数,就是实际返回的退出码
- 结合上下文的错误提示字符串,对应到具体场景
内容的提问来源于stack exchange,提问作者Jeff Gaer
相关产品推荐
相关产品推荐

