linux kernel 錯誤返回__linux

來源:互聯網
上載者:User

使用錯誤返回等與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來判斷所有的返回為指標的調用。













聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.