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()宏扩展到什么以及如何执行它.
测试提供的指针是否应被视为错误值而不是有效的数据指针.
将低于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 检查。