
沉淀、分享、成长,让自己和他人都能有所收获!😄
📢错误代码由内核或用户空间应用程序(通过errno变量)解释。错误处理在软件开发中非常重要,而不仅仅是在内核开发中。幸运的是,内核提供的几种错误,几乎涵盖了可能会遇到的所有错误,有时需要把它们打印出来以帮助进行调试。
为给定的错误返回错误的错误码会导致内核或用户空间应用产生不必要的行为,从而做出错误的决定。为了保持清楚,内核中预定义的错误几乎涵盖了我们可能遇到的所有情况.一些错误(及其含义)在include/uapi/asm-generic/errno-base.h中定义,列表的其余错误可以在include/uapi/asm-generic/errno.h中找到。
目录:include/uapi/asm-generic/errno-base.h
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */#ifndef_ASM_GENERIC_ERRNO_BASE_H#define_ASM_GENERIC_ERRNO_BASE_H#defineEPERM1/* Operation not permitted */#defineENOENT2/* No such file or directory */#defineESRCH3/* No such process */#defineEINTR4/* Interrupted system call */#defineEIO5/* I/O error */#defineENXIO6/* No such device or address */#defineE2BIG7/* Argument list too long */#defineENOEXEC8/* Exec format error */#defineEBADF9/* Bad file number */#defineECHILD10/* No child processes */#defineEAGAIN11/* Try again */#defineENOMEM12/* Out of memory */#defineEACCES13/* Permission denied */#defineEFAULT14/* Bad address */#defineENOTBLK15/* Block device required */#defineEBUSY16/* Device or resource busy */#defineEEXIST17/* File exists */#defineEXDEV18/* Cross-device link */#defineENODEV19/* No such device */#defineENOTDIR20/* Not a directory */#defineEISDIR21/* Is a directory */#defineEINVAL22/* Invalid argument */#defineENFILE23/* File table overflow */#defineEMFILE24/* Too many open files */#defineENOTTY25/* Not a typewriter */#defineETXTBSY26/* Text file busy */#defineEFBIG27/* File too large */#defineENOSPC28/* No space left on device */#defineESPIPE29/* Illegal seek */#defineEROFS30/* Read-only file system */#defineEMLINK31/* Too many links */#defineEPIPE32/* Broken pipe */#defineEDOM33/* Math argument out of domain of func */#defineERANGE34/* Math result not representable */#endif目录:include/uapi/asm-generic/errno.h
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */#ifndef_ASM_GENERIC_ERRNO_H#define_ASM_GENERIC_ERRNO_H#include<asm-generic/errno-base.h>#defineEDEADLK35/* Resource deadlock would occur */#defineENAMETOOLONG36/* File name too long */#defineENOLCK37/* No record locks available *//* * This error code is special: arch syscall entry code will return * -ENOSYS if users try to call a syscall that doesn't exist. To keep * failures of syscalls that really do exist distinguishable from * failures due to attempts to use a nonexistent syscall, syscall * implementations should refrain from returning -ENOSYS. */#defineENOSYS38/* Invalid system call number */#defineENOTEMPTY39/* Directory not empty */#defineELOOP40/* Too many symbolic links encountered */#defineEWOULDBLOCKEAGAIN /* Operation would block */#defineENOMSG42/* No message of desired type */#defineEIDRM43/* Identifier removed */#defineECHRNG44/* Channel number out of range */#defineEL2NSYNC45/* Level 2 not synchronized */#defineEL3HLT46/* Level 3 halted */#defineEL3RST47/* Level 3 reset */#defineELNRNG48/* Link number out of range */#defineEUNATCH49/* Protocol driver not attached */#defineENOCSI50/* No CSI structure available */#defineEL2HLT51/* Level 2 halted */#defineEBADE52/* Invalid exchange */#defineEBADR53/* Invalid request descriptor */#defineEXFULL54/* Exchange full */#defineENOANO55/* No anode */#defineEBADRQC56/* Invalid request code */#defineEBADSLT57/* Invalid slot */#defineEDEADLOCKEDEADLK#defineEBFONT59/* Bad font file format */#defineENOSTR60/* Device not a stream */#defineENODATA61/* No data available */#defineETIME62/* Timer expired */#defineENOSR63/* Out of streams resources */#defineENONET64/* Machine is not on the network */#defineENOPKG65/* Package not installed */#defineEREMOTE66/* Object is remote */#defineENOLINK67/* Link has been severed */#defineEADV68/* Advertise error */#defineESRMNT69/* Srmount error */#defineECOMM70/* Communication error on send */#defineEPROTO71/* Protocol error */#defineEMULTIHOP72/* Multihop attempted */#defineEDOTDOT73/* RFS specific error */#defineEBADMSG74/* Not a data message */#defineEOVERFLOW75/* Value too large for defined data type */#defineENOTUNIQ76/* Name not unique on network */#defineEBADFD77/* File descriptor in bad state */#defineEREMCHG78/* Remote address changed */#defineELIBACC79/* Can not access a needed shared library */#defineELIBBAD80/* Accessing a corrupted shared library */#defineELIBSCN81/* .lib section in a.out corrupted */#defineELIBMAX82/* Attempting to link in too many shared libraries */#defineELIBEXEC83/* Cannot exec a shared library directly */#defineEILSEQ84/* Illegal byte sequence */#defineERESTART85/* Interrupted system call should be restarted */#defineESTRPIPE86/* Streams pipe error */#defineEUSERS87/* Too many users */#defineENOTSOCK88/* Socket operation on non-socket */#defineEDESTADDRREQ89/* Destination address required */#defineEMSGSIZE90/* Message too long */#defineEPROTOTYPE91/* Protocol wrong type for socket */#defineENOPROTOOPT92/* Protocol not available */#defineEPROTONOSUPPORT93/* Protocol not supported */#defineESOCKTNOSUPPORT94/* Socket type not supported */#defineEOPNOTSUPP95/* Operation not supported on transport endpoint */#defineEPFNOSUPPORT96/* Protocol family not supported */#defineEAFNOSUPPORT97/* Address family not supported by protocol */#defineEADDRINUSE98/* Address already in use */#defineEADDRNOTAVAIL99/* Cannot assign requested address */#defineENETDOWN100/* Network is down */#defineENETUNREACH101/* Network is unreachable */#defineENETRESET102/* Network dropped connection because of reset */#defineECONNABORTED103/* Software caused connection abort */#defineECONNRESET104/* Connection reset by peer */#defineENOBUFS105/* No buffer space available */#defineEISCONN106/* Transport endpoint is already connected */#defineENOTCONN107/* Transport endpoint is not connected */#defineESHUTDOWN108/* Cannot send after transport endpoint shutdown */#defineETOOMANYREFS109/* Too many references: cannot splice */#defineETIMEDOUT110/* Connection timed out */#defineECONNREFUSED111/* Connection refused */#defineEHOSTDOWN112/* Host is down */#defineEHOSTUNREACH113/* No route to host */#defineEALREADY114/* Operation already in progress */#defineEINPROGRESS115/* Operation now in progress */#defineESTALE116/* Stale file handle */#defineEUCLEAN117/* Structure needs cleaning */#defineENOTNAM118/* Not a XENIX named type file */#defineENAVAIL119/* No XENIX semaphores available */#defineEISNAM120/* Is a named type file */#defineEREMOTEIO121/* Remote I/O error */#defineEDQUOT122/* Quota exceeded */#defineENOMEDIUM123/* No medium found */#defineEMEDIUMTYPE124/* Wrong medium type */#defineECANCELED125/* Operation Canceled */#defineENOKEY126/* Required key not available */#defineEKEYEXPIRED127/* Key has expired */#defineEKEYREVOKED128/* Key has been revoked */#defineEKEYREJECTED129/* Key was rejected by service *//* for robust mutexes */#defineEOWNERDEAD130/* Owner died */#defineENOTRECOVERABLE131/* State not recoverable */#defineERFKILL132/* Operation not possible due to RF-kill */#defineEHWPOISON133/* Memory page has hardware error */#endif大多情况下,经典的返回错误方式是这种形式:return -ERROR,特别是在响应系统调用时。例如,对于I/O错误,错误代码是EIO,应该执行的语句是return -EIO:
dev =init(&ptr);if(!dev)return-EIO错误有时会跨越内核空间,传播到用户空间。如果返回的错误是对系统调用(open, read, ioctl, mmap)的响应,则该值将自动赋给用户空间errno全局变量,在该变量上调用strerror(errno)可以将错误转换为可读字符串:
#include<errno.h>/* 访问errno全局变量 */#include<string.h>...if(write(fd, buf,1)<0){printf("something gone wrong! %s\n",strerror(errno));}...当遇到错误时,必须撤销在这个错误发生之前的所有设置。通常的做法是使用goto语句。