成功可以设置errno吗?

Sam*_*ott 2 vxworks errno

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

我发现这很令人惊讶。

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

Sam*_*ott 7

维基百科上errno.h说:

\n
\n

当某些库函数检测到错误时,会将值(错误号)存储在 errno 中。程序启动时,存储的值为零。库函数仅存储大于零的值。\n任何库函数都可以更改返回之前存储的值,无论它们是否检测到错误。大多数函数通过返回特殊值来表明它们检测到错误,对于返回指针的函数,通常为 NULL;对于返回整数的函数,通常为 \xe2\x88\x921。一些函数要求调用者将 errno 预设为零,然后对其进行测试以查看是否检测到错误。

\n
\n

因此,除了ENODEV套接字的奇怪值之外write,似乎有理由认为某些内部操作已设置errnowrite恢复(或不关心),但不允许重置errno为 0 或之前的值。

\n

这意味着除非紧接在其返回值表明有意义的函数之后,否则errno不能被认为是有意义的。errno

\n

由此得出的想法errno不能用于事后推断一系列errno影响操作中的失败。

\n

只有当库函数清除中间序列时,这种使用才可能实现errno,但由于它们不清除errno,内部恢复的错误条件仍然反映在 中errno

\n

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

\n

errno如果不通过其他方式独立返回成功/失败状态,则无法使用全局共享变量通过函数调用层次结构来隧道退出状态。

\n