IS_ERR() Linux 中的宏
IS_ERR() macro in Linux
在了解如何编写设备驱动程序时,我遇到了 IS_ERR() 宏。但我找不到它是如何工作的。我已经包含以下代码:
majorNumber = register_chrdev(0, DEVICE_NAME, &fops);
if (majorNumber<0)
{
printk(KERN_ALERT "Failed to register a major number\n");
return majorNumber;
}
printk(KERN_INFO "Registered correctly with major number %d\n", majorNumber);
// Register the device class
ebbcharClass = class_create(THIS_MODULE, CLASS_NAME);
if (IS_ERR(ebbcharClass))
{
unregister_chrdev(majorNumber, DEVICE_NAME);
printk(KERN_ALERT "Failed to register device class\n");
return PTR_ERR(ebbcharClass);
}
那么 IS_ERR() 宏扩展到什么以及它是如何执行的。
测试提供的指针是否应被视为错误值。
它不检查指针是否有效。
在您的代码中,IS_ERR 用于检查 class_create
是否成功创建 ebbcharClass
。如果发生错误,请注销字符驱动程序并发出错误信号。
您可以在 err.h
中找到宏和内联函数
如果您想知道宏扩展到什么,只需使用 gcc 的 -E
选项编译您的文件,它只会执行 pre-processing。它将包含所有 headers 并展开所有宏。
宏本身并不 "get executed",它只是一种 "search and replace" 类型的东西。
小心陷阱:
#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)
#define MAX_ERRNO 4095
这里涵盖-1到-4095,代表错误码,不是4096以下的数字,也不是NULL(0)。
从 0 到 4294963201 (0xfffff001) 的每个值都被认为没有错误。
不要用它来覆盖 NULL 检查。
在了解如何编写设备驱动程序时,我遇到了 IS_ERR() 宏。但我找不到它是如何工作的。我已经包含以下代码:
majorNumber = register_chrdev(0, DEVICE_NAME, &fops);
if (majorNumber<0)
{
printk(KERN_ALERT "Failed to register a major number\n");
return majorNumber;
}
printk(KERN_INFO "Registered correctly with major number %d\n", majorNumber);
// Register the device class
ebbcharClass = class_create(THIS_MODULE, CLASS_NAME);
if (IS_ERR(ebbcharClass))
{
unregister_chrdev(majorNumber, DEVICE_NAME);
printk(KERN_ALERT "Failed to register device class\n");
return PTR_ERR(ebbcharClass);
}
那么 IS_ERR() 宏扩展到什么以及它是如何执行的。
测试提供的指针是否应被视为错误值。
它不检查指针是否有效。
在您的代码中,IS_ERR 用于检查 class_create
是否成功创建 ebbcharClass
。如果发生错误,请注销字符驱动程序并发出错误信号。
您可以在 err.h
如果您想知道宏扩展到什么,只需使用 gcc 的 -E
选项编译您的文件,它只会执行 pre-processing。它将包含所有 headers 并展开所有宏。
宏本身并不 "get executed",它只是一种 "search and replace" 类型的东西。
小心陷阱:
#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)
#define MAX_ERRNO 4095
这里涵盖-1到-4095,代表错误码,不是4096以下的数字,也不是NULL(0)。 从 0 到 4294963201 (0xfffff001) 的每个值都被认为没有错误。 不要用它来覆盖 NULL 检查。