C++ 用户定义的errno范围值(特定于POSIX或Linux)
对于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来传达这个失败。因此,我的用户定义故障代码不应与系统定义的
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通常是这样。但是在一个实现中,errnox
的值是“未知错误代码”可能在另一个实现上定义了某些内容。您不能简单地使用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