Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我应该设置错误吗?_C_Errno - Fatal编程技术网

C 我应该设置错误吗?

C 我应该设置错误吗?,c,errno,C,Errno,我正在编写一个模块,它导出一个类似于send和recv的接口 由于这些函数应该分别返回发送和接收的字节数,因此我无法像通常那样进行正确的错误管理(即使用枚举数并返回助记符值) 在这种情况下,我应该像标准库那样设置errno?如果是这样的话,因为errno是线程特定的,有没有一种特殊的写入方式,或者我可以简单地给它赋值 编辑:试验时,我注意到按作业设置errno是有效的。不过:这对任何系统来说都是安全和可移植的吗?实际上,您可能可以进行“适当”(正如您所说)的错误管理,因为您返回了int 只需对读

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

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

在这种情况下,我应该像标准库那样设置
errno
?如果是这样的话,因为
errno
是线程特定的,有没有一种特殊的写入方式,或者我可以简单地给它赋值

编辑:试验时,我注意到按作业设置
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错误

。。。和
errno
,它扩展为具有int类型的可修改左值,其值由多个库函数设置为正错误数

这有点旧,但表示您可以直接分配给它,即使它是一个宏,并且它将是线程本地的:

errno
的唯一可移植值是
EDOM
ERANGE


因此,这就回答了您的可移植性问题。

您可以只为
errno
指定一个值,但请记住,根据您的情况,还有其他方式来表示错误,可能更合适:

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

  • 是的,您可以分配给它,是的,分配将是线程安全的。请参见

    不仅可以设置
    错误号
    ,而且在许多情况下应该设置
    错误号
    。调用某些库函数时,只有先将
    errno
    设置为零,才能可靠地检测到错误

    从POSIX规范的
    strtol

    [CX][Option Start]如果成功,strtol()函数将不会更改errno的设置

    由于0、{LONG_MIN}或{LLONG_MIN}和{LONG_MAX}或{LLONG_MAX}在出错时返回,并且在成功时也是有效的返回,因此希望检查错误情况的应用程序应将errno设置为0,然后调用strtol()或strtoll(),然后检查errno。[选项结束]


    我对分配它的技术细节更感兴趣,但我没想到会出现这种可移植性问题!:)@Dacav-我不认为有任何特殊的方法可以设置它…您只需分配给它…如果可能,我会使用
    errno.h
    中定义的给定枚举值。该列表不太完整,
    EILSEQ
    是标准强制要求的。@prelic我关于设置它的问题来自这样一个事实,即它是一个使用宏实现的特定于线程的全局变量+1表示枚举值(当然,如果您想要有意义的值,则需要严格使用该值!)@R。。当我读到更多的时候,我发现…不确定那篇文章是否过时或只是错了。
    errno
    几乎被POSIX中的所有函数使用(除了返回错误代码和一些奇怪的异常的函数),而不仅仅是低级的东西。对于
    errno
    和C标准,你想知道的远不止这些,请看,它一点也不奇怪:-)标准声明它扩展为可修改的左值。