用户定义的errno范围值(特定于POSIX或Linux)

寡头:

可能的话,有关POSIX的问题,否则有关Linux特定平台的问题:

  1. 有用户定义的errno值吗?(关于信号SIGUSR1SIGUSR2
  2. 如何找到errno系统未使用值?(负值?)
  3. 如何防止strerror()摔跤?errnum签收前检查?)

我的代码open()是资源,并通知另一个对象。如果发生故障(成功为零),则该通知Event将传达给系统errno

但是也可以在我的代码中检测到失败,例如if(count>=size)我想重用该字段Event::errnum来传达此故障。因此,我的用户定义的故障代码不应与系统定义的errno重叠

我发现errno范围9000–11000保留给用户,但这似乎特定于事务处理工具 ...

注意我的问题不是关于库定义的errnostruct Event不会暴露我的代码外。我的代码不会覆盖errno

下面的代码段是在但我的问题也适用于

#include <cerrno>

#define E_MY_USER_DEFINED_ERROR 9999

struct Event
{
    int fd;
    int errnum;
};

struct Foo
{
    Foo( int sz ) : count(0), size(sz) {}

    Event open( const char name[] )
    {
        if( count >= size )
            return { -1, E_MY_USER_DEFINED_ERROR };

        int fd = 1; // TODO: open ressource...
        if (fd < 0) return { -1, errno };
        else        return { fd, 0 };
    }

    int count, size;
};

int main()
{
    Foo bar(0);
    Event e = bar.open("my-ressource");
    // send Event to another object...
}
PP:

实际errno值未由C和C ++标准定义。因此,无法返回一个特定的(正)整数并保证它不会与实现使用的整数冲突。C标准仅需要三个marco:

C11草稿,7.5错误

宏是

益登
EILSEQ
ERANGE

可以扩展为int类型,不同的正值的整数常量表达式,并且适合在#if预处理指令中使用;

因此,您不知道errno在实现中定义了哪些其他值。

errno值是标准C和POSIX中的正整数。因此,您可以使用自己的负数表示负号来定义自己的错误号。但是,那么您将无法使用strerror / perror接口。因此,您可能需要附加包装以供strerror / perror解释您自己的错误号。

就像是:

enum myErrors{
ERR1 = -1,
ERR2 = -2,
...
ERR64 = -64
};

char *my_strerror(int e)
{
   if (e>=ERR1 && e<=ERR2)
      return decode_myerror(e); // decode_myerror can have a map for  
                                //your error numbers and return string representing 'e'.
   else
      return strerror(e);
}

和一个类似的perror

注意errno0在调用“ open-resource”之前,还应该设置,以确保errno确实由您的函数设置了。

在这种情况下,我会完全避免使用标准的errno并定义我自己的错误枚举。如果您的“开放资源”不太复杂,并且返回的错误代码太多,则可以这样做。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档