目前内核中是否有类似strerror
的功能?我找不到一个,所以我的想法是否定的,但更重要的是,他们有没有讨论过这个问题?我认为它可以减少故障排除时间,因为您不必查找错误代码(并非每个人都记住了),并且可能使系统管理员和日常普通用户(通过dmesg
)更容易。
我想在邮寄LKML之前问这里。我的想法是双重机制,一个用于错误名称(例如,EINVAL
),另一个用于描述。此外,可以将%m
glibc扩展添加到printk,但由于glibc扩展名为errno
,因此必须读取错误代码。也许%m
可以打印错误名称,而%M
可以打印错误说明吗?
无论如何,如果添加它,它应该是.config选项,因为它会膨胀文本大小。只需将错误名称(当前为1到133)存储在单个字符串中,并在每个字符串之间使用空终止符并且只是慢速strerror
(强制迭代字符串并计算空终止符),可以缩小大小。 ,因为这个速度无关紧要。内部错误512-529必须在单独的字符串中。然后,可以返回指向以null结尾的字符串的直接指针,而无需复制任何内容。根据我的计算,错误名称大约需要1322个字节,描述需要3540个字节(基于每个错误的#define之后的注释中的内容以及当前缺少的那些添加“无描述”)。
然后,当禁用配置时,printk %m
可能只会被解释为%d
而%M
可能只会打印任何内容(或某些内容)。
答案 0 :(得分:5)
不,没有。但您可以在include/asm-generic/errno.h
和include/asm-generic/errno-base.h
中看到错误代码列表。没有太多(少于200个),所以在开发过程中学习它们并不太难。
答案 1 :(得分:0)
char *get_error(int error){
int er = abs(error);
switch(er){
case EPERM:
return "Operation not permitted";
case ENOENT:
return "No such file or directory";
case ESRCH:
return "No such process";
case EINTR:
return "Interrupted system call";
case EIO:
return "I/O error";
case ENXIO:
return "No such device or address";
case E2BIG:
return "Argument list too long";
case ENOEXEC:
return "Exec format error";
case EBADF:
return "Bad file number";
case ECHILD:
return "No child processes";
case EAGAIN:
return "Try again Or Operation would block";
case ENOMEM:
return "Out of memory";
case EACCES:
return "Permission denied";
case EFAULT:
return "Bad address";
case ENOTBLK:
return "Block device required";
case EBUSY:
return "Device or resource busy";
case EEXIST:
return "File exists";
case EXDEV:
return "Cross-device link";
case ENODEV:
return "No such device";
case ENOTDIR:
return "Not a directory";
case EISDIR:
return "Is a directory";
case EINVAL:
return "Invalid argument";
case ENFILE:
return "File table overflow";
case EMFILE:
return "Too many open files";
case ENOTTY:
return "Not a typewriter";
case ETXTBSY:
return "Text file busy";
case EFBIG:
return "File too large";
case ENOSPC:
return "No space left on device";
case ESPIPE:
return "Illegal seek";
case EROFS:
return "Read-only file system";
case EMLINK:
return "Too many links";
case EPIPE:
return "Broken pipe";
case EDOM:
return "Math argument out of domain of func";
case ERANGE:
return "Math result not representable";
case EDEADLK:
return "Resource deadlock would occur";
case ENAMETOOLONG:
return "File name too long";
case ENOLCK:
return "No record locks available";
case ENOSYS:
return "Invalid system call number";
case ENOTEMPTY:
return "Directory not empty";
case ELOOP:
return "Too many symbolic links encountered";
case ENOMSG:
return "No message of desired type";
case EIDRM:
return "Identifier removed";
case ECHRNG:
return "Channel number out of range";
case EL2NSYNC:
return "Level 2 not synchronized";
case EL3HLT:
return "Level 3 halted";
case EL3RST:
return "Level 3 reset";
case ELNRNG:
return "Link number out of range";
case EUNATCH:
return "Protocol driver not attached";
case ENOCSI:
return "No CSI structure available";
case EL2HLT:
return "Level 2 halted";
case EBADE:
return "Invalid exchange";
case EBADR:
return "Invalid request descriptor";
case EXFULL:
return "Exchange full";
case ENOANO:
return "No anode";
case EBADRQC:
return "Invalid request code";
case EBADSLT:
return "Invalid slot";
case EBFONT:
return "Bad font file format";
case ENOSTR:
return "Device not a stream";
case ENODATA:
return "No data available";
case ETIME:
return "Timer expired";
case ENOSR:
return "Out of streams resources";
case ENONET:
return "Machine is not on the network";
case ENOPKG:
return "Package not installed";
case EREMOTE:
return "Object is remote";
case ENOLINK:
return "Link has been severed";
case EADV:
return "Advertise error";
case ESRMNT:
return "Srmount error";
case ECOMM:
return "Communication error on send";
case EPROTO:
return "Protocol error";
case EMULTIHOP:
return "Multihop attempted";
case EDOTDOT:
return "RFS specific error";
case EBADMSG:
return "Not a data message";
case EOVERFLOW:
return "Value too large for defined data type";
case ENOTUNIQ:
return "Name not unique on network";
case EBADFD:
return "File descriptor in bad state";
case EREMCHG:
return "Remote address changed";
case ELIBACC:
return "Can not access a needed shared library";
case ELIBBAD:
return "Accessing a corrupted shared library";
case ELIBSCN:
return ".lib section in a.out corrupted";
case ELIBMAX:
return "Attempting to link in too many shared libraries";
case ELIBEXEC:
return "Cannot exec a shared library directly";
case EILSEQ:
return "Illegal byte sequence";
case ERESTART:
return "Interrupted system call should be restarted";
case ESTRPIPE:
return "Streams pipe error";
case EUSERS:
return "Too many users";
case ENOTSOCK:
return "Socket operation on non-socket";
case EDESTADDRREQ:
return "Destination address required";
case EMSGSIZE:
return "Message too long";
case EPROTOTYPE:
return "Protocol wrong type for socket";
case ENOPROTOOPT:
return "Protocol not available";
case EPROTONOSUPPORT:
return "Protocol not supported";
case ESOCKTNOSUPPORT:
return "Socket type not supported";
case EOPNOTSUPP:
return "Operation not supported on transport endpoint";
case EPFNOSUPPORT:
return "Protocol family not supported";
case EAFNOSUPPORT:
return "Address family not supported by protocol";
case EADDRINUSE:
return "Address already in use";
case EADDRNOTAVAIL:
return "Cannot assign requested address";
case ENETDOWN:
return "Network is down";
case ENETUNREACH:
return "Network is unreachable";
case ENETRESET:
return "Network dropped connection because of reset";
case ECONNABORTED:
return "Software caused connection abort";
case ECONNRESET:
return "Connection reset by peer";
case ENOBUFS:
return "No buffer space available";
case EISCONN:
return "Transport endpoint is already connected";
case ENOTCONN:
return "Transport endpoint is not connected";
case ESHUTDOWN:
return "Cannot send after transport endpoint shutdown";
case ETOOMANYREFS:
return "Too many references: cannot splice";
case ETIMEDOUT:
return "Connection timed out";
case ECONNREFUSED:
return "Connection refused";
case EHOSTDOWN:
return "Host is down";
case EHOSTUNREACH:
return "No route to host";
case EALREADY:
return "Operation already in progress";
case EINPROGRESS:
return "Operation now in progress";
case ESTALE:
return "Stale file handle";
case EUCLEAN:
return "Structure needs cleaning";
case ENOTNAM:
return "Not a XENIX named type file";
case ENAVAIL:
return "No XENIX semaphores available";
case EISNAM:
return "Is a named type file";
case EREMOTEIO:
return "Remote I/O error";
case EDQUOT:
return "Quota exceeded";
case ENOMEDIUM:
return "No medium found";
case EMEDIUMTYPE:
return "Wrong medium type";
case ECANCELED:
return "Operation Canceled";
case ENOKEY:
return "Required key not available";
case EKEYREVOKED:
return "Key has been revoked";
case EKEYREJECTED:
return "Key was rejected by service";
case EOWNERDEAD:
return "Owner died";
case ENOTRECOVERABLE:
return "State not recoverable";
case ERFKILL:
return "Operation not possible due to RF-kill";
case EHWPOISON:
return "Memory page has hardware error";
}
return "Unknown Error Dash!";
}
EXPORT_SYMBOL(get_error);