首页 > 系统相关 >Linux驱动开发:处理空指针错误,ERR_PTR、IS_ERR、PTR_ERR用法

Linux驱动开发:处理空指针错误,ERR_PTR、IS_ERR、PTR_ERR用法

时间:2025-01-16 16:12:38浏览次数:1  
标签:返回 indio 函数 ERR dev Linux PTR

免责声明:本文内容摘自《Linux设备驱动开发》一书,作者为John Madieu,译者为袁鹏飞、刘寿永,由人民邮电出版社出版。本文仅为分享知识和讨论之用,非商业用途。书籍版权归原作者及出版社所有。本人及本博客不对因使用或误用本文内容而产生的任何后果负责。请读者尊重版权,合理使用内容。

当返回指针的函数返回错误时,通常返回的是NULL指针。而去检查为什么会返回空指针是没有任何意义的,因为无法准确了解为什么会返回空指针。
为此,内核提供了3个函数 ERR_PTR、IS_ERR 和 PTR_ERR:

void *ERR_PTR(long error);
long IS_ERR(const void *ptr);
long PTR_ERR(const void *ptr);

第一个函数实际上把错误值作为指针返回。假若函数在内存申请失败后要执行语句 return -ENOMEM;,则必须改为这样的语句:return ERR_PTR(-ENOMEM);
第二个函数用于检查返回值是否是指针错误:if (IS_ERR(foo))。最后一个函数返回实际错误代码:return PTR_ERR(foo);。以下是一个例子,说明如何使用
ERR_PTR、IS_ERR、PTR_ERR:

  1. 返回指针的函数
static struct iio_dev *indiodev_setup() {
	[...]
	struct iio_dev *indio_dev;
	indio_dev = devm_iio_device_alloc(&data->client->dev, sizeof(data));
	if (!indio_dev)
		return ERR_PTR(-ENOMEM);
	[...]
	return indio_dev;
}
  1. 返回错误代码的函数
static int foo_probe([...]) {
	[...]
	struct iio_dev *my_indio_dev = indiodev_setup();
	if (IS_ERR(my_indio_dev))
		return  PTR_ERR(data->acc_indio_dev);
	[...]
}

关于错误处理补充一点,摘录自内核编码风格部分:
如果函数名称是动作或命令式命令,则函数返回的错误代码应该是整数;如果函数名称是一个谓词,则函数应该返回布尔值 succeeded (成功的)。
例如, add work 是一个命令,add_work()函数返回0表示成功,返回-EBUSY表示失败。同样,PCI device present 是谓词,pci_dev_present()
函数如果成功匹配设备,则返回1;否则返回0。

标签:返回,indio,函数,ERR,dev,Linux,PTR
From: https://www.cnblogs.com/hfwz/p/18675147

相关文章

  • 在Linux系统上创建一个200GB的交换空间
    步骤1:创建交换文件选择新的磁盘位置:假设你希望将交换空间放置在/mnt/data目录下(可以是任何其他挂载的磁盘分区)。首先确保该目录或挂载点存在。bashsudomkdir-p/mnt/data创建200GB的交换文件:使用dd命令创建一个200GB的交换文件。200GB=204800MB,因此需要指定文......
  • Linux开启服务器审计
    Linux开启服务器审计在Linux服务器上启用auditd(LinuxAuditFramework的守护进程)可以帮助记录系统活动,例如文件访问、用户登录等,为安全审计提供支持。以下是详细的步骤: 安装 auditd在大多数Linux发行版中,auditd 通常是默认安装的。如果未安装,可以通过包管理器安装......
  • Linux互联网主机代理内网主机访问互联网
    互联网主机1、安装squidsquid代理内网主机访问互联网yum-yinstallsquidcat/etc/squid/squid.conf##Recommendedminimumconfiguration:##Exampleruleallowingaccessfromyourlocalnetworks.#Adapttolistyour(internal)IPnetworksfromwherebrows......
  • Ubuntu升级Linux内核教程
    本文作者CVE-柠檬i:https://www.cnblogs.com/CVE-Lemon本文使用的方法是dpkg安装,目前版本为5.4.0-204,要升级成5.8.5版本下载下载网站:https://kernel.ubuntu.com/mainline/在该网站下载deb包,选择自己想要升级的版本,这里是5.8.5https://kernel.ubuntu.com/mainline/v5.8.5/am......
  • 【YashanDB知识库】解压安装包时报错"tar:Error is not recoverable"
    本文内容来自YashanDB官网,原文内容请见https://www.yashandb.com/newsinfo/7919233.html?templateId=1718516现象解压安装时报如下错误:、分析过程1、检查解包命令是否正确tar--help2、查询CPU类型(arm/x86,32bit/64bit)是否与包匹配lscpu3、检查MD5值,md5sum再下载......
  • Linux Shell 脚本编程基础知识篇—sed文本处理工具
    ℹ️大家好,我是练小杰,今天是周三了,距离星期五还有两天......
  • C语言——linux 【互斥锁、死锁、信号量、条件变量】内附代码及练习
    1、思维导图2、互斥锁1.互斥锁实现互斥的代码3.防死锁默认防死锁trylock(不推荐,容易破环互斥的同步性)常用防死锁的方式有——递归锁、错误检查锁函数原型:intpthread_mutexattr_settype(pthread_mutexattr_t*attr,intkind);功能描述:将互斥锁属性attr,设置成kind类......
  • linux、git、adb常用命令
    linux:ls:查看所有当前目录下文件和目录名称pwd:查看当前路径mkdir:增加文件rmdir:删除文件mv:移动或重命名cp:复制gzip:添加解压gz格式tar:添加或解压tar格式zip:添加或解压zip格式adb:adbdevices:查看设备adbinstall:安装应用adbunstall:删除应用adblogcat:查看设备日志a......
  • 【YashanDB知识库】导入数据时报错:YAS-00008 type convert error:literal does not mat
    本文内容来自YashanDB官网,原文内容请见https://www.yashandb.com/newsinfo/7901522.html?templateId=1718516现象将数据通过SQL语气导入崖山时报错:YAS-00008typeconverterror:literaldoesnotmatchformatstring原因插入日期类型的字符串,不是配置参数DATE_FORMAT所指......
  • Linux运维学习记录13
    1.在两台服务器上安装kvm虚拟化,把其中一台的虚拟机迁移到另一台。一台服务器apt-getupdateapt-yinstallcpu-checkeraptinstallqemu-kvmvirt-managerlibvirt-daemon-systemapt-yinstallbridge-utilsaptupdate&&apt-yinstallcockpitcockpit-machines创建......