内核中是不是有 perror 的等价物?

Posted

技术标签:

【中文标题】内核中是不是有 perror 的等价物?【英文标题】:Is there an equvalent for perror in the kernel?内核中是否有 perror 的等价物? 【发布时间】:2012-04-17 20:42:50 【问题描述】:

内核中的 perror() 是什么?我无法从错误值中分辨出错误代码是什么,即仅 -22。

【问题讨论】:

【参考方案1】:

Linux 内核只是使用否定的 errno 代码作为约定。所以查看asm-generic/errno-base.hasm-generic/errno.h 并找到...

#define EINVAL          22      /* Invalid argument */

例如,如果您将NULL 传递给不接受NULL 的函数,就会发生这种情况。这取决于功能。

【讨论】:

问题是关于使用perror(),而不是关于错误代码的含义。所以这不是一个好的答案。 @user3629249:这个问题实际上不是关于使用perror,而是关于如何解释内核中的错误代码。 perror 函数仅在用户空间可用,在内核中不可用。【参考方案2】:

我知道这个问题很老,但我遇到了它,我找到了一个比接受的答案更令人满意的解决方法。

确实没有实际的错误,但可以以更好的方式打印错误 (https://www.kernel.org/doc/html/latest/core-api/printk-formats.html#error-pointers)。我们需要做的就是提供错误指针,或者如果我们有一个数值(基本上只是一个转换)并且我们已经确定,则使用 ERR_PTR 函数对其进行转换。

然后可以直接打印错误或创建自己的错误,如示例中所示:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>

#define MYPERROR(str, err) printk(str ": %pe\n", ERR_PTR(error))

static int __init mymodule_init(void) 
    int error = -22;
    printk("The error is %pe\n", ERR_PTR(error));
    MYPERROR("Failure", error);
    return 0;


static void __exit mymodule_exit(void) 


module_init(mymodule_init);
module_exit(mymodule_exit);

MODULE_LICENSE("GPL");

【讨论】:

以上是关于内核中是不是有 perror 的等价物?的主要内容,如果未能解决你的问题,请参考以下文章

Linux 内核源码中likely()和unlikely()

Linux 内核中 likely 与 unlikely 的宏定义解析

在内核空间中是不是有类似于 qsort() 的函数?

将结构传递给内核时是不是有任何性能下降?

Linux 2.6 OSS 声音系统中是不是有内核内重采样

搞懂内核编程