内核领域中的错误处理/检查

Lio*_*lan 2 c linux linux-kernel

errno内核领域中的等价物是什么?更准确地说,我如何检查发生了什么错误,例如在使用类似的函数时kmalloc()

小智 6

Linux 内核使用几种不同的方法来处理错误情况。与 C 用户空间程序不同,函数不会将其错误代码存储在全局变量中,而是直接返回值。您通常会看到这是按如下方式完成的:

  • 除了错误代码之外不返回任何值的函数通常0在成功和-ESOMETHING失败时返回。
  • 可能返回非负数值(例如,索引、文件描述符编号或字节长度)的函数是类似的:0 或更高表示成功,负值表示错误。
  • 返回指针的函数可能会返回一个特殊范围内的值以指示错误。通过调用IS_ERR()返回值,您可以检查是否发生了错误。随着PTR_ERR()您可以提取错误代码,这再次被否定。

不幸的是,该kmalloc()函数没有使用这些样式。它NULL在失败时返回而不给你一个特定的错误代码。

  • 我想补充一点,如果提供的大小为 0,`kmalloc()` 也可以返回 `ZERO_SIZE_PTR`。所以你应该在调用 `kmalloc()` 之前明确检查你的大小,以避免处理 `ZERO_SIZE_PTR`。另外,考虑使用“PTR_ERR_OR_ZERO()”而不是“PTR_RET()”(现在已弃用)、“IS_ERR()”和“PTR_ERR()”之类的东西。 (2认同)