/usr/include/asm-generic/errno-base.h和errno.h对errno值的宏定义

本文详细介绍了Linux系统中errno错误代码的定义与使用方法。从基本的头文件引入到具体的错误代码含义,如EIO(输入输出错误)、ENOMEM(内存不足)等,帮助开发者更好地理解和处理程序运行过程中遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不同的系统对errno值的定义是不同的,这里给出的是RedHat Linux内核对于它的设定

在代码中如何应用:
extern int errno;//表示外部调用errno,就可以方便的看到errno值的改变

1./usr/include/asm-generic/errno-base.h

#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

2./usr/include/asm-generic/errno.h

#ifndef _ASM_GENERIC_ERRNO_H
#define _ASM_GENERIC_ERRNO_H

#include <asm-generic/errno-base.h>

#define EDEADLK     35  /* Resource deadlock would occur */
#define ENAMETOOLONG    36  /* File name too long */
#define ENOLCK      37  /* No record locks available */
#define ENOSYS      38  /* Function not implemented */
#define ENOTEMPTY   39  /* Directory not empty */
#define ELOOP       40  /* Too many symbolic links encountered */
#define EWOULDBLOCK EAGAIN  /* Operation would block */
#define ENOMSG      42  /* No message of desired type */
#define EIDRM       43  /* Identifier removed */
#define ECHRNG      44  /* Channel number out of range */
#define EL2NSYNC    45  /* Level 2 not synchronized */
#define EL3HLT      46  /* Level 3 halted */
#define EL3RST      47  /* Level 3 reset */
#define ELNRNG      48  /* Link number out of range */
#define EUNATCH     49  /* Protocol driver not attached */
#define ENOCSI      50  /* No CSI structure available */
#define EL2HLT      51  /* Level 2 halted */
#define EBADE       52  /* Invalid exchange */
#define EBADR       53  /* Invalid request descriptor */
#define EXFULL      54  /* Exchange full */
#define ENOANO      55  /* No anode */
#define EBADRQC     56  /* Invalid request code */
#define EBADSLT     57  /* Invalid slot */

#define EDEADLOCK   EDEADLK

#define EBFONT      59  /* Bad font file format */
#define ENOSTR      60  /* Device not a stream */
#define ENODATA     61  /* No data available */
#define ETIME       62  /* Timer expired */
#define ENOSR       63  /* Out of streams resources */
#define ENONET      64  /* Machine is not on the network */
#define ENOPKG      65  /* Package not installed */
#define EREMOTE     66  /* Object is remote */
#define ENOLINK     67  /* Link has been severed */
#define EADV        68  /* Advertise error */
#define ESRMNT      69  /* Srmount error */
#define ECOMM       70  /* Communication error on send */
#define EPROTO      71  /* Protocol error */
#define EMULTIHOP   72  /* Multihop attempted */
#define EDOTDOT     73  /* RFS specific error */
#define EBADMSG     74  /* Not a data message */
#define EOVERFLOW   75  /* Value too large for defined data type */
#define ENOTUNIQ    76  /* Name not unique on network */
#define EBADFD      77  /* File descriptor in bad state */
#define EREMCHG     78  /* Remote address changed */
#define ELIBACC     79  /* Can not access a needed shared library */
#define ELIBBAD     80  /* Accessing a corrupted shared library */
#define ELIBSCN     81  /* .lib section in a.out corrupted */
#define ELIBMAX     82  /* Attempting to link in too many shared libraries */
#define ELIBEXEC    83  /* Cannot exec a shared library directly */
#define EILSEQ      84  /* Illegal byte sequence */
#define ERESTART    85  /* Interrupted system call should be restarted */
#define ESTRPIPE    86  /* Streams pipe error */
#define EUSERS      87  /* Too many users */
#define ENOTSOCK    88  /* Socket operation on non-socket */
#define EDESTADDRREQ    89  /* Destination address required */
#define EMSGSIZE    90  /* Message too long */
#define EPROTOTYPE  91  /* Protocol wrong type for socket */
#define ENOPROTOOPT 92  /* Protocol not available */
#define EPROTONOSUPPORT 93  /* Protocol not supported */
#define ESOCKTNOSUPPORT 94  /* Socket type not supported */
#define EOPNOTSUPP  95  /* Operation not supported on transport endpoint */
#define EPFNOSUPPORT    96  /* Protocol family not supported */
#define EAFNOSUPPORT    97  /* Address family not supported by protocol */
#define EADDRINUSE  98  /* Address already in use */
#define EADDRNOTAVAIL   99  /* Cannot assign requested address */
#define ENETDOWN    100 /* Network is down */
#define ENETUNREACH 101 /* Network is unreachable */
#define ENETRESET   102 /* Network dropped connection because of reset */
#define ECONNABORTED    103 /* Software caused connection abort */
#define ECONNRESET  104 /* Connection reset by peer */
#define ENOBUFS     105 /* No buffer space available */
#define EISCONN     106 /* Transport endpoint is already connected */
#define ENOTCONN    107 /* Transport endpoint is not connected */
#define ESHUTDOWN   108 /* Cannot send after transport endpoint shutdown */
#define ETOOMANYREFS    109 /* Too many references: cannot splice */
#define ETIMEDOUT   110 /* Connection timed out */
#define ECONNREFUSED    111 /* Connection refused */
#define EHOSTDOWN   112 /* Host is down */
#define EHOSTUNREACH    113 /* No route to host */
#define EALREADY    114 /* Operation already in progress */
#define EINPROGRESS 115 /* Operation now in progress */
#define ESTALE      116 /* Stale file handle */
#define EUCLEAN     117 /* Structure needs cleaning */
#define ENOTNAM     118 /* Not a XENIX named type file */
#define ENAVAIL     119 /* No XENIX semaphores available */
#define EISNAM      120 /* Is a named type file */
#define EREMOTEIO   121 /* Remote I/O error */
#define EDQUOT      122 /* Quota exceeded */

#define ENOMEDIUM   123 /* No medium found */
#define EMEDIUMTYPE 124 /* Wrong medium type */
#define ECANCELED   125 /* Operation Canceled */
#define ENOKEY      126 /* Required key not available */
#define EKEYEXPIRED 127 /* Key has expired */
#define EKEYREVOKED 128 /* Key has been revoked */
#define EKEYREJECTED    129 /* Key was rejected by service */

/* for robust mutexes */
#define EOWNERDEAD  130 /* Owner died */
#define ENOTRECOVERABLE 131 /* State not recoverable */

#define ERFKILL     132 /* Operation not possible due to RF-kill */

#define EHWPOISON   133 /* Memory page has hardware error */

#endif
<think>我们正在处理用户关于Linux系统中`asm/errno.h`头文件存放目录的问题。根据提供的引用内容,我们可以得到以下信息:引用[1]提到:在安装好的Linux系统中,`errno.h`的位置可能通过一系列符号链接最终指向`asm-generic/errno-base.h`或`asm/errno.h`。具体路径是:`usr/include/errno.h ->bits/errno.h ->linux/errno.h ->asm/errno.h(这里含有40以后的errno)-> asm-generic/errno-base.h` 引用[2][3]都提到`errno.h`被定义在`/usr/include/bits/errno.h`文件中,并且讨论了`errno`的线程安全性。因此,我们可以推断`asm/errno.h`头文件的实际位置可能在`/usr/include/asm/errno.h`或`/usr/include/asm-generic/errno.h`,但具体取决于系统架构(例如x86、arm等)Linux发行版。 在标准的Linux系统中,`asm`目录通常是一个指向特定架构目录的符号链接。例如,在x86_64系统中,`/usr/include/asm`可能指向`/usr/include/x86_64-linux-gnu/asm`。 用户需要查找`asm/errno.h`,我们可以建议用户通过以下方式查找: 1.在`/usr/include/`目录下查找`asm`目录,然后进入该目录查看是否有`errno.h`。2.使用`find`命令:`find/usr/include -name errno.h| grepasm`。但是,根据引用[1]的描述,`usr/include/errno.h`实际上通过一系列符号链接指向了`asm/errno.h`,所以我们可以直接查看这些链接: ```bashls -l /usr/include/errno.hls-l/usr/include/bits/errno.hls -l /usr/include/linux/errno.hls-l/usr/include/asm/errno.h#如果存在的话```注意:用户可能需要安装内核头文件包(如`linux-headers`)才能确保这些头文件存在。 另外,引用[4]提到了uClibc库的交叉编译,这提示我们如果用户是在交叉编译环境下,那么头文件的位置可能位于工具链的目录中,例如工具链的`sysroot`目录下。因此,我们可以总结:-在本地系统中,`asm/errno.h`通常位于`/usr/include/asm/errno.h`,但该路径可能是一个符号链接,实际指向特定架构的目录。-在交叉编译工具链中,该文件可能位于工具链的`include`目录下,例如`/path/to/toolchain/arm-hisiv100nptl-linux/include/asm/errno.h`。 基于以上分析,我们将给出回答。</think>### Linux asm/errno.h 头文件位置解析 在Linux系统中,`asm/errno.h`头文件的位置取决于系统架构内核头文件安装情况。根据引用内容[^1][^2][^3]的分析: #### 1. 标准系统路径 在已安装内核头文件的Linux系统中,路径通常为: ``` /usr/include/asm/errno.h ``` 但实际路径可能通过符号链接指向架构特定目录: ``` /usr/include/errno.h -> bits/errno.h -> linux/errno.h -> asm/errno.h ``` 最终位置取决于系统架构: - x86_64系统:`/usr/include/x86_64-linux-gnu/asm/errno.h` - ARM系统:`/usr/include/arm-linux-gnueabihf/asm/errno.h` #### 2. 内核源码路径 在未安装头文件的场景下(如开发环境),可直接在Linux内核源码中找到: ``` linux-kernel-source/arch/<ARCH>/include/uapi/asm/errno.h ``` 例如x86架构: ``` linux-kernel-source/arch/x86/include/uapi/asm/errno.h ``` #### 3. 验证方法 ```bash # 查找系统头文件位置 find /usr/include -name errno.h | grep asm # 跟踪符号链接 ls -l /usr/include/asm/errno.h readlink -f /usr/include/asm/errno.h # 检查架构特定路径 ls /usr/include/*-linux-gnu*/asm/errno.h ``` #### 4. 特殊说明 - **交叉编译环境**(如引用[^4]提到的uClibc):路径位于工具链目录中: ``` /path/to/toolchain/arm-hisiv100nptl-linux/include/asm/errno.h ``` - **线程安全性**:如引用[^2][^3]所示,现代Linux中`errno`通过`(*__errno_location())`实现线程安全。 > 提示:如果找不到该文件,可能需要安装内核头文件包,例如在Debian/Ubuntu中使用:`sudo apt install linux-headers-$(uname -r)`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值