本部分介绍了 Zircon 中使用的一组存在用户空间的错误。第一部分提供每个错误代码的规范名称和说明。第二部分提供具体的值。
在内核中,错误通常由 status_t
类型的变量导致,而错误则由 ZX_ERR_CANONICAL_NAME
格式的宏(例如 ZX_ERR_INTERNAL
)定义。所有错误情况均为负值,成功用非负值表示。
在用户空间中,系统调用调度层 (libzircon) 将结果值公开为 zx_status_t
类型的变量,这些变量目前使用与内核相同的拼写和值来表示错误,但对于错误,将转为使用 0 表示成功,并使用正值表示错误。
如需查看内核内部值的列表,请参阅内核内部错误。
说明
每个类别表示一类错误。每个类别中的第一个错误代码是相应类别的通用代码,在没有更具体的代码适用时使用。某个类别中的其他错误代码(如果有)表示相应类中特定类型的错误。一般而言,应尽可能选择更具体的错误代码。
错误根据操作、参数、主题和标识符进行描述。操作通常是函数或系统调用。实参通常是调用的参数。操作对象是指操作对其执行操作的主要对象,通常是句柄,通常作为第一个参数传递。标识符通常是数字或字符串,用于明确标识操作中使用的资源。
类别
成功
ZX_OK 操作成功。
常规错误
这些错误消息表示系统在尝试操作时遇到了常规错误。
INTERNAL 系统在执行此操作时遇到其他未指定的错误。
NOT_SUPPORTED 操作不受支持、实现或未启用。
NO_RESOURCES 系统无法分配执行操作所需的某些资源。
NO_MEMORY 系统无法分配操作所需的内存。
参数错误
这些指示调用方指定的参数未指定有效操作,或者对指定操作无效。
INVALID_STRING 参数无效。
WRONG_TYPE 操作主题的类型不正确,无法执行操作。 示例:尝试对线程句柄执行 message_read。
BAD_SYSCALL 指定的系统调用号码无效。
BAD_HANDLE 指定的句柄值并不引用句柄。
OUT_OF_RANGE 参数超出了此操作的有效范围。注意:当参数在系统更改状态时可能有效时,将使用此参数,这与 INVALID_STRING 不同,此参数在参数永远无效时使用。
BUFFER_TOO_SMALL 调用方提供的缓冲区太小,无法执行此操作。
前提条件或状态错误
这表明操作无法成功,因为操作的前提条件不满足,或者系统无法在当前状态下完成操作。
BAD_STATE 系统无法在当前状态下执行操作。 注意:FAILED_PRECONDITION 是此错误的保留别名
NOT_FOUND:找不到请求的实体。
TIMED_OUT 操作完成前所经过的操作时间限制。
ALREADY_EXISTS 具有指定标识符的对象已存在。 示例:如果已存在同名文件,则尝试创建文件。
ALREADY_BOUND 由于命名实体已由另一实体拥有或控制,因此操作失败。 稍后,如果当前所有者释放该实体,操作可能会成功。
HANDLE_CLOSED 正在等待的句柄已关闭。
PEER_CLOSED 操作失败,因为操作对象的远程端已关闭。
UNAVAILABLE 操作对象目前无法执行此操作。 注意:如果调用方无法直接观察到主题何时能够执行操作并因此应重试,则使用此方法。
SHOULD_WAIT 操作当前无法执行,但如果调用方等待满足前提条件,例如等待句柄可读取或可写入,则可能成功执行。 示例:如果尝试从没有消息等待状态但有打开的遥控器的通道读取数据,将返回 SHOULD_WAIT。如果尝试从没有消息等待且远程端已关闭的通道读取数据,将返回 PEER_CLOSED。
权限错误
ACCESS_DENIED 调用方无权执行指定的操作。
输入/输出错误
IO I/O 期间发生其他不明错误。
IO_REFUSED 正在进行 I/O 操作的实体拒绝了操作。示例:I2C 设备 NAK 事务或磁盘控制器拒绝无效命令。
IO_DATA_INTEGRITY 操作中的数据未通过完整性检查,可能已损坏。 示例:CRC 或奇偶性错误。
IO_DATA_LOSS 操作中的数据目前不可用,可能会永久丢失。 示例:磁盘块以不可恢复的方式损坏。