Linux内核errno-base.h源码分析

上次写过一个博客,主要关于内核错误相关的源码分析(链接),最近突然发现上次的分析不完善,因此本次完善相关分析。
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 是面向用户空间程序的接口

  • 26
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值