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;
}