c++ 错误号errno

认识errno

errno定义于头文件<cerrno> <errno.h> errno 是用于错误指示的预处理器宏。它展开成一个静态 (C++11 前)线程局域 (C++11 起)的 int 类型可修改左值。
数个标准库函数通过写入正整数到 errno 指示错误。 errno 的值被典型地设置为作为列于 <cerrno> 的,以字母 E 起始,后随大写字母或数字的宏常量。
程序启动时 errno 的值为 ​0​ ,而且尽管不管在错误发生与否时,允许写入正整数到 errno ,库函数决不会存储 ​0​ 于 errno

常见错误码

c++11为了减少平台差异匹配了POSIX错误码中的大多数具体标准c的请参见<errno.h>文件及包含部分,有些可能是平台扩展的linux可以参照 man errno(3)

E2BIG  (C++11) //参数列表过长
EACCES  (C++11) //权限被禁止
EADDRINUSE  (C++11) //地址在使用中
EADDRNOTAVAIL  (C++11) //地址不可用
EAFNOSUPPORT  (C++11) //不支持地址系列
EAGAIN  (C++11) //资源不可用,须重试
EALREADY  (C++11) //连接已在进行
EBADF  (C++11) //坏的的文件描述符
EBADMSG  (C++11) //坏的消息
EBUSY  (C++11) //设备或资源忙
ECANCELED  (C++11) //操作取消
ECHILD  (C++11) //无子进程
ECONNABORTED  (C++11) //连接被打断
ECONNREFUSED  (C++11) //连接被拒绝
ECONNRESET  (C++11) //连接被重置
EDEADLK  (C++11) //资源死锁会发生
EDESTADDRREQ  (C++11) //要求目标地址
EDOM 数学参数在函数定义域外
EEXIST  (C++11) //文件已存在
EFAULT  (C++11) //坏的地址
EFBIG  (C++11) //文件过大
EHOSTUNREACH  (C++11) //主机不可抵达
EIDRM  (C++11) //标识符被移除
EILSEQ  (C++11) //非法字节序列
EINPROGRESS  (C++11) //操作已在进行
EINTR  (C++11) //函数被中断
EINVAL  (C++11) //非法参数
EIO  (C++11) //I/O 错误
EISCONN  (C++11) //接头已连接
EISDIR  (C++11) //是目录
ELOOP  (C++11) //符号链接级别过多
EMFILE  (C++11) //文件描述符值过大
EMLINK  (C++11) //链接过多
EMSGSIZE  (C++11) //消息过大
ENAMETOOLONG  (C++11) //文件名过长
ENETDOWN  (C++11) //网络不工作
ENETRESET  (C++11) //连接被网络打断
ENETUNREACH  (C++11) //网络不可抵达
ENFILE  (C++11) //系统中打开文件过多
ENOBUFS  (C++11) //无缓冲空间可用
ENODATA  (C++11) //流头已读取队列中无消息
ENODEV  (C++11) //无此设备
ENOENT  (C++11) //无此文件或目录
ENOEXEC  (C++11) //可执行文件格式错误
ENOLCK  (C++11) //无可用锁
ENOLINK  (C++11) //链接已切断
ENOMEM  (C++11) //空间不足
ENOMSG  (C++11) //无所需类型消息
ENOPROTOOPT  (C++11) //协议不可用
ENOSPC  (C++11) //设备无剩余空间
ENOSR  (C++11) //无流资源
ENOSTR  (C++11) //非流
ENOSYS  (C++11) //不支持的函数
ENOTCONN  (C++11) //未连接的接头
ENOTDIR  (C++11) //非目录
ENOTEMPTY  (C++11) //目录非空
ENOTRECOVERABLE  (C++11) //状态不可恢复
ENOTSOCK  (C++11) //非接头
ENOTSUP  (C++11) //不支持
ENOTTY  (C++11) //不适合的 I/O 控制操作
ENXIO  (C++11) //无此设备或地址
EOPNOTSUPP  (C++11) //接头上不支持的操作
EOVERFLOW  (C++11) //值过大而无法存入数据类型
EOWNERDEAD  (C++11) //先前拥有者已死
EPERM  (C++11) //操作不允许
EPIPE  (C++11) //管道损坏
EPROTO  (C++11) //协议错误
EPROTONOSUPPORT  (C++11) //不支持的协议
EPROTOTYPE  (C++11) //接头类型错误的协议
ERANGE 结果过大
EROFS  (C++11) //只读文件系统
ESPIPE  (C++11) //非法寻位
ESRCH  (C++11) //无此进程
ETIME  (C++11) //流 ioctl() 超时
ETIMEDOUT  (C++11) //连接超时
ETXTBSY  (C++11) //文本文件忙
EWOULDBLOCK  (C++11) //操作会阻塞
EXDEV  (C++11) //跨设备链接 

错误处理函数

/**
打印当前存储于系统变量 errno 的错误码到 stderr
 1. 如果s为空指针或s所指向字符为空字符 则直接输出错误消息。负责为s:错误消息
 2. 描述存储于errno的错误码的错误消息字符串后随 '\n'
*/
void perror( const char *s );//stdio.h 
/**
返回指向系统错误码 errnum 的文本表示的指针,它等同于 std::perror() 会打印的描述
通常从 errno 对象获得 errnum ,不过函数接受任何 int 类型值。字符串的内容是本地环境限定的。
程序必须不修改返回的字符串,但对 strerror 函数的后继调用可能重写该字符串。
不要求 strerror 为线程安全。实现可以返回指向静态只读字符串字面量的不同指针,
或反复返回指向静态缓冲区的同一指针而 strerror 于该缓冲区中放置字符串
*/
char* strerror( int errnum );//string.h
同strerror只不过缓冲区由用户指定POSIX有int strerror_r(int errnum, char *strerrbuf, size_t buflen);
errno_t strerror_s( char *buf, rsize_t bufsz, errno_t errnum );//string.h[c++11]

示例

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main()
{

	errno = ENOSPC;
	perror(NULL);
	perror("");
	perror("test");
	printf("%s\n", strerror(errno));
	char err_buf[200] = { 0 };
	strerror_s(err_buf,200, errno);
	printf("%s\n", err_buf);
	getchar();
	return 0;
}

示例结果

No space left on device
No space left on device
test: No space left on device
No space left on device
No space left on device
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值