在内核的代码和驱动程序中经常见到ERR_PTR, IS_ERR, PTR_ERR这三个内联函数。
许多的内核函数需求回来一个指针,可是函数的调用或许失利,一般咱们处理这样的景象都是回来一个NULL指针,就像malloc或kmalloc在没有取得指定的空间请求时的回来值相同。可是有时咱们想知道导致函数失利的原因,可是回来NULL就显得信息不行。因而有些函数回来一个实践的过错编码以便对引起过错的原因做一些处理。许多内核接口经过把过错值编码到一个指针值中来回来过错信息。当处理这样的函数时,判别是否成功调用就不能是简略的和NULL进行比较。为了方便运用这样的类型接口,2.6的内核在linux/err.h中完成了三个内联函数:
inline void *ERR_PTR(long error)
{
return (void *) error;
}
回来指针类型的函数能够经过这个函数来回来一个过错值。这儿的error是一般的负的过错编码。调用者能够运用IS_ERR来查看所回来的指针是否是一个过错编码。
inline long IS_ERR(const void *ptr)
{
return (unsigned long)ptr > (unsigned long)-1000L;
}
假如需求实践的过错编码,能够经过PTR_ERR函数提取
inline long PTR_ERR(const void *ptr)
{
return (long) ptr;
}
只要在IS_ERR回来真的时分才干运用PTR_ERR。