gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:38:03 24 4
gpt4 key购买 nike

如果可能,针对 POSIX 的问题,其他针对 Linux 特定平台的问题:

  1. 是否有用户定义的errno值?(对于信号SIGUSR1SIGUSR2)
  2. 如何找到系统未使用的 errno 值?(负值?)
  3. 如何预防strerror() break?(在 errnum 符号之前检查?)

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

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

我找到了 errno range 9000–11000 reserved for user , 但这似乎特定于 Transaction Processing Facility ...

注意我的问题不是关于library-defined errno . struct 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...
}

最佳答案

C 和 C++ 标准未定义实际的 errno 值。所以没有办法返回一个特定的(正)整数并保证它不会与实现使用的整数发生冲突。C 标准只需要三个宏:

C11 草案,7.5 错误

The macros are

EDOM
EILSEQ
ERANGE

which expand to integer constant expressions with type int, distinct positive values, and which are suitable for use in #if preprocessing directives;

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

errno 值是标准 C 和 POSIX 中的正整数。因此,您可以使用自己的负值枚举来定义自己的错误编号。但是你不能使用 strerror/perror 接口(interface)。因此,您可能需要额外的 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

请注意,您还应该在调用“开放资源”之前将 errno 设置为 0,以确保 errno 确实由您设置功能。

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

关于c++ - 用户定义的 errno 范围值(POSIX 或特定于 Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30370338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com