【问题标题】:Can errno be set on success?errno 可以设置为成功吗?
【发布时间】:2017-07-14 12:51:13
【问题描述】:

我注意到在我的 vxWorks 6 平台上调用套接字上的write 成功完成并返回请求写入的字节数,但还将 errno 从 0 转换为 19 (ENODEV)。

我觉得这很令人惊讶。

操作成功后可以设置errno吗?

【问题讨论】:

    标签: vxworks errno


    【解决方案1】:

    errno.h 维基百科上说:

    某个库将一个值(错误号)存储在 errno 中 当他们检测到错误时起作用。在程序启动时,值 存储为零。 库函数只存储大于零的值。 任何库函数都可以更改返回前存储的值,无论是 他们是否检测到错误。大多数功能表明他们检测到 通过返回特殊值导致错误,对于函数通常为 NULL 返回指针,-1 用于返回整数的函数。一些 函数要求调用者将 errno 预设为零并对其进行测试 之后查看是否检测到错误。

    因此,除了对于套接字 write 的奇异值 ENODEV 之外,认为某些内部操作集 errnowrite 恢复(或不在乎)但不允许重置似乎是合理的errno 为 0 或之前的值。

    这意味着errno不能被认为是有意义的,除非立即在一个返回值表明errno有意义的函数之后。

    由此得出的想法是,errno 不能在之后用于推断一系列 errno 影响操作中的故障。

    只有在库函数清除errno mid-sequence 时才能使用这种方法,但由于它们不清除errno,内部恢复的错误情况仍会反映在errno 中。

    如果您需要知道某个函数是否失败,您需要立即检查它的结果,并且适用。

    您不能使用全局共享变量errno 通过函数调用的层次结构来隧道退出状态,除非还通过其他方式独立地返回成功/失败状态。

    【讨论】:

      猜你喜欢
      • 2018-07-31
      • 1970-01-01
      • 2011-09-21
      • 2012-04-09
      • 1970-01-01
      • 2012-05-29
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多