对于写C程序的人来说,errno并不是一个陌生的变量,无论你是在用户态还是在内核态。简短来说,errno是用来保存错误信息,这些信息反应了相应错误原因。因此,一个小小errno就可以连接user space programmer 与 kernel space programmers,可见其重要性。但是,我们的programmers确又常常忽略这些,他们往往只看中正确与错误,而不是去访问强大的errno获取更多的信息。对于普通的程序,为此可能仅仅是"没关系,大不了可以重启"。但是,对于一些重要的任务,重启可能意味着灾难的发生,尤其是在重要的领域。为此,这里我想给大家列出常见的errno,提醒大家在处理设备时,"check errno when your routine failed!".
Linux errno 在0.* 版本中大约只有三四十个,但是当Linux kenel飞速膨胀时,errno的数量也在增加,具体,有多少在你的linux版本中,你可以通过 man errno 查看,或者直接打开文件:
include/linux/errno.h
这里只是列出了常用的或最早期的一些errno:
引用:#define EPERM 1 /* Operation not permitted */
拒绝操作,通常是权限的问题,例如普通用户删除root的文件
#define ENOENT 2 /* No such file or directory */
没有相应的文件或目录,例如打开不存的文件
#define ESRCH 3 /* No such process */
没有相应的进程,例如kill掉一个不存在的进程号
#define EINTR 4 /* Interrupted system call */
中断的系统调用
#define EIO 5 /* I/O error */
I/O错误
#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 */
不是一个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 */
错误的seek操作
#define EROFS 30 /* Read-only file system */
只读文件系统
#define EMLINK 31 /* Too many links */
连接太多
#define EPIPE 32 /* Broken pipe */
PIPE崩溃
#define EDOM 33 /* Math argument out of domain of func */
数学参数超出了函数域
#define ERANGE 34 /* Math result not representable */
无法表示数学结果