我正在编写一个导出类似于send
和recv
的界面的模块。
由于这些函数应该分别返回发送和接收字节的数量,因此我无法正常进行错误管理(即使用枚举和返回助记符值)。
在这样的情况下,我应该像标准库那样设置errno
吗?如果是这样,因为errno
是特定于线程的,是否有特定的写入方式,或者我可以简单地为其赋值?
修改:试验它我发现通过分配设置errno
是有效的。仍然:这对任何系统都是安全和便携的吗?
答案 0 :(得分:32)
这有点旧,但errno - manual section 3表示您可以直接分配给它,即使它是一个宏,它也将是本地线程
答案 1 :(得分:17)
不仅 你设置errno
,在很多情况下你应该设置errno
。调用某些库函数时,如果首先将errno
设置为零,则只能可靠地检测到错误。 See strtol
for an example
来自strtol
的POSIX规范:
[CX] [Option Start]如果成功,strtol()函数不应更改errno的设置。
从0开始,{LONG_MIN}或{LLONG_MIN},{LONG_MAX}或{LLONG_MAX}在错误时返回,并且在成功时也是有效返回,希望检查错误情况的应用程序应将errno设置为0,然后调用strtol()或strtoll(),然后检查errno。 [选项结束]
答案 2 :(得分:8)
实际上,您可能可以执行“正确”(如您所说)错误管理,因为您返回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类型的可修改左值,其值由多个库函数设置为正误差数。
答案 3 :(得分:6)
您可以为errno
分配一个值,但请记住,还有其他方法可以发出错误信号,根据您的情况,可能更合适:
int *
(或size_t *
或您使用的任何内容)的输出参数。然后,您可以返回错误代码。答案 4 :(得分:2)
来自:http://support.sas.com/documentation/onlinedoc/sasc/doc700/html/lr1/errno.htm
errno
的唯一可移植值为EDOM
和ERANGE
这样就可以回答你的可移植性问题了。
答案 5 :(得分:2)
是的,您可以分配给它,是的,分配将是线程安全的。见Is errno thread-safe?