我注意到我的vxWorks 6平台在套接字上成功调用write
并返回请求写入的字节数,但也将errno从0转换为19(ENODEV
)。
我觉得这很令人惊讶。
成功操作后是否可以设置错误?
答案 0 :(得分:1)
在errno.h
维基百科上说:
值(错误号)由某个库存储在errno中 在检测到错误时起作用。在程序启动时,值 存储为零。 库函数仅存储大于零的值。 无论是否任何库函数都可以改变返回之前存储的值 他们是否发现错误。大多数功能表明他们检测到了 返回一个特殊值,通常为函数NULL 返回指针,返回整数的函数为-1。一些 函数要求调用者将errno预设为零并对其进行测试 然后查看是否检测到错误。
除了ENODEV
对于套接字write
的奇怪价值之外,认为某些内部操作集errno
和write
已恢复(或没有)护理)但不允许将errno
重置为0或之前的状态。
暗示errno
不能被视为有意义,除了立即在返回值表明errno
有意义的函数之后。
由此得出的结论是errno
之后不能用于推断errno
- 影响操作序列中的失败。
只有在库函数未清除errno
中间序列时才能使用此类用途,但由于它们无法清除errno
,因此内部恢复的错误情况仍会反映在errno
中
如果您需要知道某个功能是否失败,您需要立即检查它的结果,并且仅在适用时才查询errno。
您不能使用全局共享变量errno
通过函数调用层次结构来隧道退出状态,也不能通过其他方式独立返回成功/失败状态。