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 检查。