许多内部的内核函数返回一个指针值给调用者,而这些函数中很多可能会失败。在大部分情况下,失败是通过返回一个NULL指针值来表示的。这种技巧有作用,但是它不能传递问题的确切性质。某些接口确实需要返回一个实际的错误编码,以使调用者可以根据实际的情况做出正确的决策。
许多内核接口通过把错误值编码到一个指针中来返回错误信息。这种函数必须小心使用,因为它的返回值不能简单地和NULL比较。为了帮助创建和使用这种类型的接口。内核提供了一小组函数。
返回指针类型的函数可以通过如下函数返回一个错误值:
void *ERR_PTR(long err);
这里error是通常的负的错误码。调用者可以使用IS_ERR来检查所返回的指针是否是一个错误编码:
long IS_ERR(const void *ptr);
如果需要实际的错误编码,可以通过如下函数把它提取出来:
long PTR_ERR(const void *ptr);
应该只有在IS_ERR对某值返回真值时才对该值使用PTR_ERR,因为任何其他值都是有效的指针。