【问题标题】:"'errno' undeclared" when compile Linux kernel编译 Linux 内核时出现“'errno' undeclared”
【发布时间】:2016-11-13 12:50:09
【问题描述】:

我正在尝试编译,但我不断收到以下错误: enter image description here

我已经包含了一次asm-i386/errno.h,但它没有用。我也尝试过包含linux/errno.h,但它不起作用。

我应该包含什么文件?

【问题讨论】:

  • Linux 内核中没有errno 变量:这个变量只存在于用户空间。如果内核函数因错误而终止,则可以从返回值中提取错误代码(如果是)。
  • @Tsyvarev 我认为您应该将评论移至答案。这是完全有效的,但我会添加有关如何设置 errno 的额外信息:stackoverflow.com/questions/24567584/…
  • @AndrejsCainikovs:感谢您的链接。最初我想将问题标记为重复问题,这就是我发表评论而不是回答的原因。但后来我决定这个问题比引用的问题更广泛,我决定提供一个答案。
  • @RawanR:堆栈溢出要求错误日志应该在问题帖子本身中(作为文本),而不是链接图像。我已将错误消息的主要部分添加到标题中,但仍然需要错误日志的文本形式。此外,值得说明的是,您是编译内核模块还是内核本身(带有您的修改)。

标签: compiler-errors linux-kernel operating-system kernel errno


【解决方案1】:

Linux 内核中没有errno 变量:这个变量只存在于用户空间中。

如果内核函数想要报告错误并指定错误代码,它将错误代码封装到返回值中。这种封装有 3 种可能性,取决于成功返回的值类型:

  1. 函数成功返回 0,失败返回否定错误代码。

这种最常用的约定有时称为0/-err

  1. 函数在成功时返回有效指针,在失败时返回表达式ERR_PTR(err)

这个表达式被计算为指针,它永远不会指向真正的内核对象。即使 NULL 是有效结果,也可以使用此约定。

  1. 函数成功时返回正整数,失败时返回否定错误代码:+val/-err

如果 0 是有效结果,也可以使用此约定:+val/0/-err


当用户空间库需要根据内核请求设置errno时,它会检查系统调用的结果(这是向内核执行请求的唯一方式)。根据系统调用,使用 1 或 3 约定(任何系统调用的返回类型为 long)。

在内核空间中为用户空间“设置”errno 的示例参见here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 2017-03-09
    相关资源
    最近更新 更多