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

C++ 用户定义的errno范围值(特定于POSIX或Linux),c++,c,linux,errno,user-defined,C++,C,Linux,Errno,User Defined,对于POSIX的问题(如果可能),对于Linux特定平台的问题: 是否有用户定义的errno值?(对于信号SIGUSR1和SIGUSR2) 如何查找系统未使用的errno值?(负值?) 如何防止断裂?(在errnum符号前检查) 我的代码open()一个资源并通知另一个对象。如果发生故障(成功时为零),通知事件将传达系统errno 但故障也可以在我的代码中检测到,例如,如果(count>=size)。我想重用字段Event::errnum来传达这个失败。因此,我的用户定义故障代码不应与系统定义的

对于POSIX的问题(如果可能),对于Linux特定平台的问题:

  • 是否有用户定义的
    errno
    值?
    (对于信号
    SIGUSR1
    SIGUSR2
  • 如何查找系统未使用的
    errno
    值?
    (负值?)
  • 如何防止断裂?(在
    errnum
    符号前检查)
  • 我的代码
    open()
    一个资源并通知另一个对象。如果发生故障(成功时为零),通知
    事件
    将传达系统
    errno

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

    我发现了,但这似乎是特定于

    请注意,我的问题不是关于。
    struct事件
    未暴露在我的代码之外。我的代码不会覆盖
    errno

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

    #包括
    #定义E_我的用户定义的错误9999
    结构事件
    {
    int-fd;
    int errnum;
    };
    结构Foo
    {
    Foo(intsz):计数(0),大小(sz){}
    事件打开(常量字符名称[])
    {
    如果(计数>=大小)
    返回{-1,E_MY_USER_DEFINED_ERROR};
    int fd=1;//TODO:打开ressource。。。
    如果(fd<0)返回{-1,errno};
    else返回{fd,0};
    }
    整数计数,大小;
    };
    int main()
    {
    福巴(0);
    事件e=条形图打开(“my ressource”);
    //将事件发送到另一个对象。。。
    }
    
    > P>实际的<代码> ErnOn/Cord>值不是由C和C++标准定义的。所以,无法返回特定的(正)整数并保证它不会与实现使用的整数冲突。 C标准只需要三个MACO:

    C11草稿,7.5个错误

    宏是

    以东
    EILSEQ
    ERANGE

    它扩展为int类型的整数常量表达式,distinct 正值,适用于#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);
    }
    
    枚举我的错误{
    ERR1=-1,
    ERR2=-2,
    ...
    ERR64=-64
    };
    char*my_strerror(内部e)
    {
    如果(e>=ERR1&&e建议使用负值作为用户定义的范围。这在我的情况下是完美的。

    下面是我的问题片段,使用了p.p.的建议。这个片段也可以在上找到

    使用叮当声输出

    Unknown error -1
    

    抛出异常。不要污染其他人的值域。我认为
    errno
    的整个想法是提供已知值并将它们与用户值混合是错误的想法。如果您想为特定于域的错误定义已知代码,请使用枚举和自己的值。您还可以破坏
    perror
    /
    strerror
    。谢谢@EJP的评论。但是这个想法是发送事件通知另一个对象。这个另一个对象可能会读取
    Event::err
    字段。在这里我不能使用异常。我应该编辑我的问题吗?谢谢@myaut对break的评论。因此,我的问题变成了是否存在一些特定的
    errno
    strerror()
    返回“这是一个用户定义的错误代码”?这个问题对您合适吗?@olibre通常是这样。但是在一个实现中,errno
    x
    的值是“未知错误代码”可能在另一个实现上定义了某些内容。您不能简单地使用
    errno
    来定义自己的错误代码。您可以按照我的回答建议解决问题,或者完全避免它,然后定义自己的错误代码。感谢Blue Moon。由于我的代码不会在外部公开
    struct事件,也不会覆盖
    errno
    ,所以我可以在我自己的
    事件::errnum
    字段:-)中使用负值已晚了几年,但我想指出的是,内部系统调用引擎使用负值返回来指示许多方法上的错误号。例如,对于read(),0(通常)文件末尾,+ve是成功读取的大小,-ve是最终写入errno的错误代码。因此,如果这些errno值有可能通过syscall接口(例如通过fusermount)传递,那么可能会出现很多问题。可能您最好将位14设置为足够高,以避免冲突,但足够低不被截断或视为符号位。
    #include <cerrno>
    #include <cstring>
    #include <iostream>
    
    #define E_MY_USER_DEFINED_ERROR -1
    
    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 = std::strlen(name); // 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");
        std::cout << std::strerror( e.errnum ) << std::endl;
    }
    
    Unknown error -1
    
    Unknown error -1