47

我正在编写一个模块,它导出类似于sendand的接口recv

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

在这种情况下,我应该errno像标准库那样设置吗?如果是这样,由于errno是线程特定的,是否有特定的书写方式,或者我可以简单地为它分配一个值?

编辑:试验它我注意到errno按分配设置是有效的。仍然:这对于任何系统来说都是安全且便携的吗?

4

6 回答 6

39

这有点老了,但是errno - 手册第 3 节说你可以直接分配给它,即使它是一个宏,它将是线程本地的

于 2012-03-25T00:20:46.507 回答
23

不仅可以设置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。[选项结束]

于 2012-07-05T11:01:46.027 回答
10

实际上,由于您返回一个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 类型的可修改左值,其值由几个库函数设置为正错误数。

于 2012-03-25T00:20:42.180 回答
6

您可以只为 分配一个值errno,但请记住,还有其他方法可以发出错误信号,根据您的情况,这些方法可能更合适:

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

是的,您可以分配给它,是的,分配将是线程安全的。请参阅errno 线程安全吗?

于 2012-03-25T00:22:37.300 回答
2

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

唯一可移植的值errnoEDOMERANGE

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

于 2012-03-25T00:20:48.280 回答