上次写过一个博客,主要关于内核错误相关的源码分析(链接),最近突然发现上次的分析不完善,因此本次完善相关分析。
Linux内核中经常见到一些返回值,如-12,比如下面是我遇到过的一个截图(在内核日志里)
但是在我上次的分析中,并没有相关说明,因此本次把这个进行完善。在linux下,有一些最常见的错误码,这个错误码在文件errno-base.h中有声明。在内核源代码的这里可以找到:
即目录 /usr/include/asm-generic/errno-base.h(如果没有这个目录,可以参考这个文章)
在我的系统下(Ubuntu 22.04 ,linux5.15)
这个文件的代码如下:
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _ASM_GENERIC_ERRNO_BASE_H
#define _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 */
#endif
简要说明如下:
在 Linux 系统调用失败时返回的错误代码:
EPERM 1: 操作不被允许
ENOENT 2: 没有这样的文件或目录
ESRCH 3: 没有这样的进程
EINTR 4: 中断的系统调用
EIO 5: I/O 错误
ENXIO 6: 没有这样的设备或地址
E2BIG 7: 参数列表过长
ENOEXEC 8: 执行格式错误
EBADF 9: 错误的文件号
ECHILD 10: 没有子进程
EAGAIN 11: 重试
ENOMEM 12: 内存不足
EACCES 13: 权限被拒绝
EFAULT 14: 错误的地址
ENOTBLK 15: 需要块设备
EBUSY 16: 设备或资源忙
EEXIST 17: 文件已存在
EXDEV 18: 跨设备链接
ENODEV 19: 没有这样的设备
ENOTDIR 20: 不是一个目录
EISDIR 21: 是一个目录
EINVAL 22: 无效的参数
ENFILE 23: 文件表溢出
EMFILE 24: 打开的文件过多
ENOTTY 25: 不是打字机
ETXTBSY 26: 文本文件忙
EFBIG 27: 文件过大
ENOSPC 28: 设备上没有剩余空间
ESPIPE 29: 非法寻找
EROFS 30: 只读文件系统
EMLINK 31: 链接过多
EPIPE 32: 破裂的管道
EDOM 33: 数学函数的参数超出函数域
ERANGE 34: 数学结果无法表示
结合我之前见到的错误,返回值为-12,对应的就是 - ENOMEM (内存不足)
报错部分的源代码在这里(1331行的代码就是在内核日志输出warning)
现在总结一下linux下的错误码。主要结合本文和上一篇文章。
errno.h 和 errno-base.h 都是用于处理和报告错误的机制的一部分
errno-base.h 是 Linux 内核的一部分,它定义了基本的错误号
而errno.h 是面向用户空间程序的接口