认识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