ERR_PTR,ERR_CAST,IS_ERR,PTR_ERR

最近在看一些kernel code,简单做一下总结。

Code

#define IS_ERR_VALUE(x) unlikely((unsigned long)(void *)(x) >= (unsigned long)-MAX_ERRNO)

static inline void * __must_check ERR_PTR(long error)
{
	return (void *) error;
}

static inline long __must_check PTR_ERR(__force const void *ptr)
{
	return (long) ptr;
}

static inline bool __must_check IS_ERR(__force const void *ptr)
{
	return IS_ERR_VALUE((unsigned long)ptr);
}

static inline bool __must_check IS_ERR_OR_NULL(__force const void *ptr)
{
	return unlikely(!ptr) || IS_ERR_VALUE((unsigned long)ptr);
}

/**
 * ERR_CAST - Explicitly cast an error-valued pointer to another pointer type
 * @ptr: The pointer to cast.
 *
 * Explicitly cast an error-valued pointer to another pointer type in such a
 * way as to make it clear that's what's going on.
 */
static inline void * __must_check ERR_CAST(__force const void *ptr)
{
	/* cast away the const */
	return (void *) ptr;
}

Link:

https://elixir.bootlin.com/linux/latest/source/include/linux/err.h#L51

ERR_PTR, ERR_CAST:用途从上面的代码应该很容易得出。

IS_ERR: 判断是否有出错。

PTR_ERR: 输出错误number。

error define

#define EPERM 1 /* Operation not permitted /
#define ENOENT 2 /
No such file or directory /
#define ESRCH 3 /
No such process /
#define EINTR 4 /
Interrupted system call /
#define EIO 5 /
I/O error /
#define ENXIO 6 /
No such device or address /
#define E2BIG 7 /
Argument list too long /
#define ENOEXEC 8 /
Exec format error /
#define EBADF 9 /
Bad file number /
#define ECHILD 10 /
No child processes /
#define EAGAIN 11 /
Try again /
#define ENOMEM 12 /
Out of memory /
#define EACCES 13 /
Permission denied /
#define EFAULT 14 /
Bad address /
#define ENOTBLK 15 /
Block device required /
#define EBUSY 16 /
Device or resource busy /
#define EEXIST 17 /
File exists /
#define EXDEV 18 /
Cross-device link /
#define ENODEV 19 /
No such device /
#define ENOTDIR 20 /
Not a directory /
#define EISDIR 21 /
Is a directory /
#define EINVAL 22 /
Invalid argument /
#define ENFILE 23 /
File table overflow /
#define EMFILE 24 /
Too many open files /
#define ENOTTY 25 /
Not a typewriter /
#define ETXTBSY 26 /
Text file busy /
#define EFBIG 27 /
File too large /
#define ENOSPC 28 /
No space left on device /
#define ESPIPE 29 /
Illegal seek /
#define EROFS 30 /
Read-only file system /
#define EMLINK 31 /
Too many links /
#define EPIPE 32 /
Broken pipe /
#define EDOM 33 /
Math argument out of domain of func /
#define ERANGE 34 /
Math result not representable */

Link

https://elixir.bootlin.com/linux/latest/source/include/uapi/asm-generic/errno-base.h#L9

列子:

static int test(void)
{
	if (true)
		return ERR_PRT(-EBUSY);
	else
		return 0;
}

int main(void)
{
	int err = 0;
	err = test();
	if (IS_ERR) {
		pr_err("error: %d.\n", PTR_ERR(err));
		return PTR_ERR(err);
	} 		
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值