Linux中的IS_ERR()宏

S.I*_*I.J 10 c linux macros linux-device-driver

在了解如何编写设备驱动程序的同时,我遇到了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);          
}
Run Code Online (Sandbox Code Playgroud)

那么IS_ERR()宏扩展到什么以及如何执行它.

LPs*_*LPs 7

测试提供的指针是否应被视为错误值而不是有效的数据指针.

将低于1000L(4096)的值视为错误而不是指针,因为这些值不是合法的指针.

在您的代码中,IS_ERR用于检查是否class_create成功创建ebbcharClass.如果发生错误,请取消注册char驱动程序并发出错误信号.

您可以在中找到MACRO和内联函数 err.h


小智 5

小心陷阱:

#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)
#define MAX_ERRNO       4095
Run Code Online (Sandbox Code Playgroud)

这包括 -1 到 -4095,表示错误代码,不是低于 4096 的数字,也不是 NULL (0)。从 0 到 4294963201 (0xfffff001) 的每个值都被认为没有错误。不要用它来覆盖 NULL 检查。