我正在编写一个模块,它导出类似于send
and的接口recv
。
由于这些函数应该分别返回发送和接收的字节数,因此我无法像往常那样进行正确的错误管理(即使用枚举并返回助记符值)。
在这种情况下,我应该errno
像标准库那样设置吗?如果是这样,由于errno
是线程特定的,是否有特定的书写方式,或者我可以简单地为它分配一个值?
编辑:试验它我注意到errno
按分配设置是有效的。仍然:这对于任何系统来说都是安全且便携的吗?
这有点老了,但是errno - 手册第 3 节说你可以直接分配给它,即使它是一个宏,它将是线程本地的
不仅可以设置errno
,很多情况下还应该设置errno
。调用某些库函数时,只有首先设置errno
为零才能可靠地检测到错误。请参阅strtol
示例。
从 POSIX 规范strtol
:
[CX] [Option Start] strtol() 函数在成功时不会改变errno 的设置。
由于 0、{LONG_MIN} 或 {LLONG_MIN} 以及 {LONG_MAX} 或 {LLONG_MAX} 在错误时返回并且也是成功时的有效返回,因此希望检查错误情况的应用程序应将 errno 设置为 0,然后调用 strtol()或 strtoll(),然后检查 errno。[选项结束]
实际上,由于您返回一个int
.
只需对读取或写入的字节数使用非负值,对错误代码使用负值。您不必将自己限制在-1
:
enum myerrors {
ERR_NO_MEMORY = -1,
ERR_BAD_ARGS = -2,
ERR_CPU_EXPLODED = -3,
// and so on
};
但是,errno
以您想要的方式设置是有效的。该标准规定errno
扩展为可修改的左值,这意味着您可以设置它。来自C1x/n1425, 7.5 Errors <errno.h>
:
...并
errno
扩展为具有 int 类型的可修改左值,其值由几个库函数设置为正错误数。
您可以只为 分配一个值errno
,但请记住,还有其他方法可以发出错误信号,根据您的情况,这些方法可能更合适:
int *
size_t *
是的,您可以分配给它,是的,分配将是线程安全的。请参阅errno 线程安全吗?
来自: http: //support.sas.com/documentation/onlinedoc/sasc/doc700/html/lr1/errno.htm
唯一可移植的值
errno
是EDOM
和ERANGE
这样就回答了您的可移植性问题。