最大errno值是多少?

时间:2015-09-18 08:13:36

标签: c errno

我想构建一个唯一的错误号,它由随机数和系统调用的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 $3}'|
sort -rn|
head -1
529

所以uint16_t似乎足以存储errno

但如何确定?如何找出操作系统实际使用的errnos数量?是否记录在哪里?

2 个答案:

答案 0 :(得分:3)

没有可移植的方法来做到这一点。 POSIX(和C)允许实现使用所有正int值作为错误号,所使用的最大数量没有常量,并且可能没有大于int的整数类型。

答案 1 :(得分:2)

您可以只传递一个包含两者 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;
}