我注意到在我的 vxWorks 6 平台上,对write套接字的调用成功完成并返回请求写入的字节数,而且还将 errno 从 0 转换为 19 ( ENODEV)。
我发现这很令人惊讶。
操作成功后可以设置errno吗?
维基百科上errno.h说:
\n\n当某些库函数检测到错误时,会将值(错误号)存储在 errno 中。程序启动时,存储的值为零。库函数仅存储大于零的值。\n任何库函数都可以更改返回之前存储的值,无论它们是否检测到错误。大多数函数通过返回特殊值来表明它们检测到错误,对于返回指针的函数,通常为 NULL;对于返回整数的函数,通常为 \xe2\x88\x921。一些函数要求调用者将 errno 预设为零,然后对其进行测试以查看是否检测到错误。
\n
因此,除了ENODEV套接字的奇怪值之外write,似乎有理由认为某些内部操作已设置errno并write恢复(或不关心),但不允许重置errno为 0 或之前的值。
这意味着除非紧接在其返回值表明有意义的函数之后,否则errno不能被认为是有意义的。errno
由此得出的想法errno不能用于事后推断一系列errno影响操作中的失败。
只有当库函数清除中间序列时,这种使用才可能实现errno,但由于它们不清除errno,内部恢复的错误条件仍然反映在 中errno。
如果您需要知道某个函数是否失败,您需要立即检查它的结果,并且仅检查它是否适用。
\nerrno如果不通过其他方式独立返回成功/失败状态,则无法使用全局共享变量通过函数调用层次结构来隧道退出状态。
| 归档时间: |
|
| 查看次数: |
4316 次 |
| 最近记录: |