errno.h
“errno.h”是一个C语言头文件,用于定义错误码。这些错误码通常与系统调用和库函数的错误条件相关联。当一个函数遇到错误时,它会设置全局变量`errno`的值,程序员可以通过检查"errno"的值来确定发生了什么错误。
error
"errno"是一个全局变量,用于存储系统调用或库函数发生错误时的错误码。它是一个整型变量,通常在头文件<errno.h>中定义。
当一个系统调用或库函数遇到错误时,它会设置"errno"的值来表示具体的错误类型。这些错误码通常以负数的形式表示,每个负数对应一种特定的错误条件。例如,"EACCES"表示权限被拒绝,"EAGAIN"表示资源暂时不可用等。程序员可以通过检查`errno`的值来确定发生了什么错误,并根据需要采取相应的措施。常见的做法是使用"strerror(errno)"函数将错误码转换为人类可读的错误消息,然后打印出来或进行其他处理。
"strerror"是一个C语言标准库函数,用于将错误码转换为对应的错误消息字符串。它接受一个整数类型的错误码作为参数,并返回一个指向描述该错误码的字符串指针。
例子如下:
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
FILE *file = fopen("non_existent_file.txt", "r");
if (file == NULL) {
printf("errno = %d\nerror opening file: %s\n %d", errno, strerror(errno));
return 1;
}
fclose(file);
return 0;
}
在上面的代码中,我们尝试打开一个不存在的文件。如果文件打开失败,"fopen"函数会返回"NULL"并将错误码设置为"errno"。然后我们使用"strerror(errno)"来获取对应的错误消息,并将其打印出来。这样,我们就可以看到具体的错误原因。例如:No such file or directory 。
上面代码运行结果:
errno = 2
error opening file: No such file or directory
在C语言中,"errno"可以包含多个错误码,这些错误码是系统调用和库函数在遇到错误时设置的。下方是一些常见的"errno"错误码和对应的符号常量及其描述。
错误码 | 符号常量 | 描述 |
EPERM | 1 | 操作不允许。表示权限被拒绝,通常因为进程没有执行操作所需的足够权限 |
ENOENT | 2 | 找不到文件或目录。表示指定的文件或目录不存在。 |
ESRCH | 3 | 找不到进程、套接字、消息队列等。用于表示进程、套接字或消息队列等资源不存在。 |
EINTR | 4 | 被中断的系统调用。表示系统调用因为接收到信号而被中断 |
EIO | 5 | 输入/输出错误。表示在进行输入/输出操作时发生了错误,例如磁盘故障。 |
ENXIO | 6 | 没有这样的设备或地址。表示指定的设备或地址不存在。 |
E2BIG | 7 | 参数列表太长。用于表示系统调用的参数列表过长。 |
ENOEXEC | 8 | 不支持的可执行文件格式。用于表示可执行文件的格式不正确。 |
EBADF | 9 | 无效的文件描述符。表示使用了一个无效的文件描述符。 |
ECHILD | 10 | 没有子进程。表示没有子进程可用于等待或已创建了过多的子进程。 |
EAGAIN | 11 | 资源暂时不可用。表示请求的资源暂时不可用,通常用于表示套接字操作中的非阻塞I/O。 |
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 | 不是类型tty的设备。表示试图在一个非tty设备上执行tty操作。 |
ETXTBSY | 26 | 文本文件繁忙。表示共享的文本文件正在被其他进程使用。 |
EFBIG | 27 | 文件太大。表示要创建或写入的文件大于文件系统允许的大小 |
ENOSPC | 28 | 没有空间留给设备。表示设备上没有足够的空间来执行操作。 |
ESPIPE | 29 | 无效的管道读取。表示试图从一个没有进程写入的管道读取数据。 |
EROFS | 30 | 只读文件系统。表示试图在只读文件系统上执行写操作。 |
EMLINK | 31 | 太多的链接。表示试图超过文件的链接数量限制。 |
EPIPE | 32 | 断开的管道。表示试图写入一个没有进程读取的管道。 |