《C/C++ 面试 100 例》(十三)errno

本文详细介绍了C语言中的errno全局变量及其在错误处理中的作用。当系统调用或I/O操作失败时,errno会被设置为相应的错误码。通过_sys_errlist数组和错误码,可以获取错误信息。此外,文章还展示了使用perror、strerror和strerror_s函数输出错误信息的方法,并列举了一些常见的错误码及其含义。

一、 errno 介绍

  • errno 是一个全局的宏;
  • 程序执行的时候会把 errno 置上对应的错误码,同时也有一些相关的宏,如下:
#define errno   (*_errno())
#define _doserrno   (*__doserrno())
#define _sys_errlist (__sys_errlist())
#define _sys_nerr (*__sys_nerr())
  • 程序开始执行的时候,errno 和 _doserrno 会被置 0,当一个系统调用出错时,errno 会被置上一个非 0 的值;因为 errno 存储了上一次调用的值,所以它可能会被成功的调用改变,所以一旦出错,需要里面把这个值输出来;
  • I/O 操作发生错误时,_doserrno 会被置上;

二、错误信息输出

  • errno 是一个数字,具体含义对应在 _sys_errlist 中,比如发生错误时,可以输出 _sys_errlist [ errno ] 来看具体含义,_sys_nerr 则代表了 _sys_errlist 这个数组的长度;
  • 为了安全性考虑,一般可以采用 perror、strerror 或 strerror_s 来进行错误码的输出;
	FILE* pf = fopen("test.txt", "r");
	if (!pf) {
		perror("perror");
		printf("strerror: %s\n", strerror(errno));
		printf( _strerror("_strerror") );
	}
perror: No such file or directory
strerror: No such file or directory
_strerror: No such file or directory

三、错误码表查询

错误码含义
NULL0No error
EPERM1Operation not permitted
ENOENT2No such file or directory
ESRCH3No such process
EINTR4Interrupted function call
EIO5Input/output error
ENXIO6No such device or address
E2BIG7Arg list too long
ENOEXEC8Exec format error
EBADF9Bad file descriptor
ECHILD10No child processes
EAGAIN11Resource temporarily unavailable
ENOMEM12Not enough space
EACCES13Permission denied
EFAULT14Bad address
/15Unknown error
EBUSY16Resource device
EEXIST17File exists
EXDEV18Improper link
ENODEV19No such device
ENOTDIR20Not a directory
EISDIR21Is a directory
EINVAL22Invalid argument
ENFILE23Too many open files in system
EMFILE24Too many open files
ENOTTY25Inappropriate I/O control operation
/26Unknown error
EFBIG27File too large
ENOSPC28No space left on device
ESPIPE29Invalid seek
EROFS30Read-only file system
MLINK31Too many links
EPIPE32Broken pipe
EDOM33Domain error
ERANGE34Result too large
/35Unknown error
EDEADLK36Resource deadlock avoided
/37Unknown error
ENAMETOOLONG38Filename too long
ENOLCK39No locks available
ENOSYS40Function not implemented
ENOTEMPTY41Directory not empty
EILSEQ42Illegal byte sequence
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

英雄哪里出来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值