【问题标题】:What is the maximum errno value?最大 errno 值是多少?
【发布时间】:2015-09-18 08:13:36
【问题描述】:

我想构建一个唯一的错误号,它由一个随机数和系统调用的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

但是如何确定呢?如何找出操作系统实际使用了多少个 errno?它是否记录在任何地方?

【问题讨论】:

  • 为什么如果int16_t被定义为int,你必须使用它?!操作系统可以在下一个补丁中随意添加任何错误编号,在您发布应用程序两天后假设它适合 16 位有符号整数。
  • 你能用struct UniqueError { int randNumber, int errnoNumber };这样的结构吗?这就是我会考虑的,就可移植性而言,而不是依赖 errno 的“最大”值(可能会随着时间和系统之间的变化而变化)
  • int 在 64 位 Linux 上只有 32 位。
  • @AdrianoRepetti 请阅读我的问题的第一句话。
  • @Andreas 这就是我问的原因,如果它在标准中指定。

标签: c errno


【解决方案1】:

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

【讨论】:

  • MAX_ERRNO 就这么简单。
【解决方案2】:

您可以只传递一个句柄,而不是包含 both 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;
}

【讨论】:

  • 代码无法编译:errid.c:6:9: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘this_func_can_fail’
  • +1 指出可以将结构用作 C 中的值:stackoverflow.com/questions/9653072/…
  • @ceving 谢谢。这并不是一个完整的可编译示例——它只是我的想法的一个快速演示。
  • 这不适用于 C89,因为没有指定的初始化程序来初始化结构。
  • @LarsFriedrich 然后你在没有字段初始化器的情况下重写它。但我更喜欢生活在 2015 年而不是 1989 年。
猜你喜欢
  • 2015-05-21
  • 2011-06-15
  • 2021-12-25
  • 2011-05-05
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
相关资源
最近更新 更多