c标准库解释(四)

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"错误码和对应的符号常量及其描述。

errno常见错误码及其对应符号常量和描述
错误码符号常量描述
EPERM1操作不允许。表示权限被拒绝,通常因为进程没有执行操作所需的足够权限
ENOENT2找不到文件或目录。表示指定的文件或目录不存在。
ESRCH3找不到进程、套接字、消息队列等。用于表示进程、套接字或消息队列等资源不存在。
EINTR4被中断的系统调用。表示系统调用因为接收到信号而被中断
EIO5输入/输出错误。表示在进行输入/输出操作时发生了错误,例如磁盘故障。
ENXIO6没有这样的设备或地址。表示指定的设备或地址不存在。
E2BIG7参数列表太长。用于表示系统调用的参数列表过长。
ENOEXEC8不支持的可执行文件格式。用于表示可执行文件的格式不正确。
EBADF9无效的文件描述符。表示使用了一个无效的文件描述符。
ECHILD10没有子进程。表示没有子进程可用于等待或已创建了过多的子进程。
EAGAIN11资源暂时不可用。表示请求的资源暂时不可用,通常用于表示套接字操作中的非阻塞I/O。
ENOMEM 12内存不足。表示系统内存不足,无法完成操作。
EACCES13权限被拒绝。表示进程试图访问一个它没有权限访问的资源。
EFAULT14错误的地址。表示系统调用的参数指向了一个无效的内存地址。
ENOTBLK15非块设备上的块操作。用于表示在非块设备上进行了块操作
EBUSY16设备或资源忙。表示设备或资源正在被占用,无法进行操作。
EEXIST17文件已存在。表示试图创建一个已经存在的文件。
EXDEV 18无效的跨设备操作。用于表示尝试在两个不同的文件系统之间进行不兼容的操作。
ENODEV19没有这样的设备。表示试图访问一个不存在的设备。
ENOTDIR20不是目录。表示试图在一个非目录的文件上执行需要目录的操作。
EISDIR21是一个目录。表示试图在一个目录上执行需要非目录的操作。
EINVAL22无效的参数。表示系统调用接收到了无效的参数。
ENFILE23打开的文件太多。表示进程已达到了同时打开文件的数量限制。
EMFILE24太多的文件描述符。表示进程已达到了文件描述符的数量限制。
ENOTTY25不是类型tty的设备。表示试图在一个非tty设备上执行tty操作。
ETXTBSY26文本文件繁忙。表示共享的文本文件正在被其他进程使用。
EFBIG27文件太大。表示要创建或写入的文件大于文件系统允许的大小
ENOSPC28没有空间留给设备。表示设备上没有足够的空间来执行操作。
ESPIPE29无效的管道读取。表示试图从一个没有进程写入的管道读取数据。
EROFS30只读文件系统。表示试图在只读文件系统上执行写操作。
EMLINK31太多的链接。表示试图超过文件的链接数量限制。
EPIPE32断开的管道。表示试图写入一个没有进程读取的管道。

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值