【发布时间】:2017-07-14 12:51:13
【问题描述】:
我注意到在我的 vxWorks 6 平台上调用套接字上的write 成功完成并返回请求写入的字节数,但还将 errno 从 0 转换为 19 (ENODEV)。
我觉得这很令人惊讶。
操作成功后可以设置errno吗?
【问题讨论】:
我注意到在我的 vxWorks 6 平台上调用套接字上的write 成功完成并返回请求写入的字节数,但还将 errno 从 0 转换为 19 (ENODEV)。
我觉得这很令人惊讶。
操作成功后可以设置errno吗?
【问题讨论】:
在errno.h 维基百科上说:
某个库将一个值(错误号)存储在 errno 中 当他们检测到错误时起作用。在程序启动时,值 存储为零。 库函数只存储大于零的值。 任何库函数都可以更改返回前存储的值,无论是 他们是否检测到错误。大多数功能表明他们检测到 通过返回特殊值导致错误,对于函数通常为 NULL 返回指针,-1 用于返回整数的函数。一些 函数要求调用者将 errno 预设为零并对其进行测试 之后查看是否检测到错误。
因此,除了对于套接字 write 的奇异值 ENODEV 之外,认为某些内部操作集 errno 和 write 恢复(或不在乎)但不允许重置似乎是合理的errno 为 0 或之前的值。
这意味着errno不能被认为是有意义的,除非立即在一个返回值表明errno有意义的函数之后。
由此得出的想法是,errno 不能在之后用于推断一系列 errno 影响操作中的故障。
只有在库函数清除errno mid-sequence 时才能使用这种方法,但由于它们不清除errno,内部恢复的错误情况仍会反映在errno 中。
如果您需要知道某个函数是否失败,您需要立即检查它的结果,并且仅适用。
您不能使用全局共享变量errno 通过函数调用的层次结构来隧道退出状态,除非还通过其他方式独立地返回成功/失败状态。
【讨论】: