解读PTR_ERR,ERR_PTR,IS_ERR

本文详细介绍了Linux内核中处理错误码的方式,包括PTR_ERR宏用于将错误码转换为指针,ERR_PTR函数用于创建表示错误的指针,以及IS_ERR宏用于检查指针是否表示错误。通过示例展示了如何在设备驱动程序中使用这些机制来处理错误情况,例如当设备操作失败时返回ERR_PTR(-EIO),并通过IS_ERR和PTR_ERR获取并打印错误码。
摘要由CSDN通过智能技术生成
解读PTR_ERR,ERR_PTR,IS_ERR

       在看内核代码时遇到几个宏PTR_ERR,ERR_PTR,IS_ERR(其实是内联函数),通过阅读内核源码,知道了这几个宏的定义,下面就说一下这几个宏的由来与用处。
        我们知道内核有些函数是返回指针的,如Kmalloc分配内存,如果分配不到内核就会返回NULL指针,这样我们可以通过判断是否是NULL指针来判断Kmalloc执行成功与否。但是有些函数返回错误时,我们不仅需要知道函数错了,还需要知道错在哪里了,也就是说我们要或得错误码。在用户空间编程的时候,因为每个线程都有一个error变量,我们可以通过访问这个变量来得到错误码。但是在内核就没有这个变量,所以不能这样或得函数执行的错误码。那么聪明的内核开发着就根据内核的地址空间特点用了一种新的方法来或得错误码,那就是PTR_ERR,ERR_PTR,IS_ERR这三个宏,暂时先不说这三个宏怎么用,我们来看一下错误码与内核地址空间的特点。

    基本的错误码在内核中的errno-base.h中,如下:

[cpp]  view plain copy
  1. #define EPERM        1  /* Operation not permitted */  
  2. #define ENOENT       2  /* No such file or directory */  
  3. #define ESRCH        3  /* No such process */  
  4. #define EINTR        4  /* Interrupted system call */  
  5. #define EIO      5  /* I/O error */  
  6. #define ENXIO        6  /* No such device or address */  
  7. 。。。。。。。  
  8.   
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值