errno 的最大值是多少?
What is the maximum errno value?
我想建立一个唯一的错误编号,它由一个随机数和一个系统调用的 errno
组成。示例:
#define ERRID(ERRNO) ((uint32_t)rand() << 16 | (uint32_t)(ERRNO) & 0xFFFF)
我需要知道存储一个 errno
值需要多少位。
我知道它被定义为int
。但错误总数远低于 64 位系统上的 9,223,372,036,854,775,807。在我的 Debian 上,最大数量似乎是 529。
dpkg -L linux-headers-3.16.0-4-common|
grep errno.h|
xargs cat|
awk '/^#define/{print }'|
sort -rn|
head -1
529
所以 uint16_t
似乎足以存储 errno
。
但是如何确定呢?我怎样才能知道操作系统实际使用了多少错误码?它有任何记录吗?
没有可移植的方法来执行此操作。 POSIX(和 C)允许实现使用所有正 int
值作为错误编号,使用的最大数量没有常量,并且可能没有大于 [=10= 的整数类型].
你可以只传递一个句柄而不是包含 errno
错误代码和随机标识符(我假设你希望这是一个唯一的 ID为了以后能够识别特定的错误实例……?)
struct ErrorID {
int errno_error;
int rand_id;
}
ErrorID this_func_can_fail()
{
return (ErrorID){ .errno_error = errno, .rand_id = rand() };
}
这样编译:
#include <errno.h>
#include <stdlib.h>
struct ErrorID {
int errno_error;
int rand_id;
};
struct ErrorID this_func_can_fail()
{
return (struct ErrorID){ .errno_error = errno, .rand_id = rand() };
}
int main (int argc, char *argv[])
{
this_func_can_fail();
return 0;
}
我想建立一个唯一的错误编号,它由一个随机数和一个系统调用的 errno
组成。示例:
#define ERRID(ERRNO) ((uint32_t)rand() << 16 | (uint32_t)(ERRNO) & 0xFFFF)
我需要知道存储一个 errno
值需要多少位。
我知道它被定义为int
。但错误总数远低于 64 位系统上的 9,223,372,036,854,775,807。在我的 Debian 上,最大数量似乎是 529。
dpkg -L linux-headers-3.16.0-4-common|
grep errno.h|
xargs cat|
awk '/^#define/{print }'|
sort -rn|
head -1
529
所以 uint16_t
似乎足以存储 errno
。
但是如何确定呢?我怎样才能知道操作系统实际使用了多少错误码?它有任何记录吗?
没有可移植的方法来执行此操作。 POSIX(和 C)允许实现使用所有正 int
值作为错误编号,使用的最大数量没有常量,并且可能没有大于 [=10= 的整数类型].
你可以只传递一个句柄而不是包含 errno
错误代码和随机标识符(我假设你希望这是一个唯一的 ID为了以后能够识别特定的错误实例……?)
struct ErrorID {
int errno_error;
int rand_id;
}
ErrorID this_func_can_fail()
{
return (ErrorID){ .errno_error = errno, .rand_id = rand() };
}
这样编译:
#include <errno.h>
#include <stdlib.h>
struct ErrorID {
int errno_error;
int rand_id;
};
struct ErrorID this_func_can_fail()
{
return (struct ErrorID){ .errno_error = errno, .rand_id = rand() };
}
int main (int argc, char *argv[])
{
this_func_can_fail();
return 0;
}