我应该设置errno吗?

时间:2012-03-25 00:08:01

标签: c errno

我正在编写一个导出类似于sendrecv的界面的模块。

由于这些函数应该分别返回发送和接收字节的数量,因此我无法正常进行错误管理(即使用枚举和返回助记符值)。

在这样的情况下,我应该像标准库那样设置errno吗?如果是这样,因为errno是特定于线程的,是否有特定的写入方式,或者我可以简单地为其赋值?

修改:试验它我发现通过分配设置errno是有效的。仍然:这对任何系统都是安全和便携的吗?

6 个答案:

答案 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分配一个值,但请记住,还有其他方法可以发出错误信号,根据您的情况,可能更合适:

  1. 不要返回读取的字节数,而是使用类型为int *(或size_t *或您使用的任何内容)的输出参数。然后,您可以返回错误代码。
  2. 假设您的返回类型是有符号类型,并且负数发送或接收的字节数没有意义,请使用负值来表示相应的错误条件。

答案 4 :(得分:2)

来自:http://support.sas.com/documentation/onlinedoc/sasc/doc700/html/lr1/errno.htm

  

errno的唯一可移植值为EDOMERANGE

这样就可以回答你的可移植性问题了。

答案 5 :(得分:2)

是的,您可以分配给它,是的,分配将是线程安全的。见Is errno thread-safe?