使用錯誤返回等與err相關的定義與操作,需包含標頭檔:
#include <linux/err.h>
常見的err說明 include/asm-generic/errno-base.h
#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 */
核心的錯誤碼儲存在記憶體最後4K的地區,即0xfffff000~0xffffffff地區。如果指標指向了這段記憶體地區,則表示出錯。如返回-EINTR錯誤,也就錯誤碼為-4(0xfffffffc),則0xfffffffc就是錯誤碼指標。
下面是出錯相關的幾個宏:
ERR_PTR()將錯誤碼轉換成指標。
include/linux/err.h
static inline void * __must_check ERR_PTR(long error) { return (void *) error; }
PTR_ERR()把指標轉換成錯誤碼。
include/linux/err.h
static inline long __must_check PTR_ERR(const void *ptr) { return (long) ptr; }
IS_ERR()判斷指標是否落在錯誤碼地區。
include/linux/err.h
static inline long __must_check IS_ERR(const void *ptr) { return IS_ERR_VALUE((unsigned long)ptr); } #define MAX_ERRNO 4095 #define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)
IS_ERR_OR_NULL()判斷指標是否落在錯誤碼地區或者為空白。
include/linux/err.h
static inline long __must_check IS_ERR_OR_NULL(const void *ptr) { return !ptr || IS_ERR_VALUE((unsigned long)ptr); }
IS_ERR()判斷的是指標是否指向錯誤碼地區,ptr==NULL或!ptr判斷的是指標是否為空白,這幾個判斷一般用在當調用的函數的傳回值為指標類型。對於IS_ERR()與ptr==NULL的使用區別,則具體要看調用的是什麼函數,如果函數在調用失敗時返回NULL指標,那麼就應該使用ptr==NULL或者!ptr。如果函數在調用失敗時返回的是指向錯誤碼區的指向,那麼就要使用IS_ERR()或者IS_ERR_VALUE()。當然也可以使用IS_ERR_OR_NULL來判斷所有的返回為指標的調用。