errno系统中的全局变量为int类型,用来记录系统的最后一次错误代码。
只有在库函数调用失败时,errno才会被赋值,当函数成功运行时,errno的值不会被修改。
因此,在使用库函数调用之前,若没有先把errno置为0,
则在调用之后用它来判断是不正确的,因为errno《0可能在系统调用之前就已经标志为错误了。
——————————————————————————————————————————
同时若用errno来检查错误时,一般不写如下的代码:
if(errno)
.........
if(errno<0)
.......
在库函数调用中,只有在函数调用返回错误了,
然后才在错误处理中通过if(xxxx==errno)的方式来查看错误类型。
因为,fopen()函数,在成功返回时,也可能把errno设置成<0,因为,
若之前的文件不存在,则相当于找不到这个文件,
从而内部的实现会把errno设置成某个值,但不会库函数调用出错返回。而是新建一个文件。
#include<fcntl.h>
#include<io.h>
//,,,,,,,,,,,,,
errno=0
int fd=open("xer.txt",O_RDWR|O_CREAT,"r");
if(fd<0){
cout<<"fd<0:"<<endl;
perror("xer.txt");
cout<<"errno="<<errno<<endl;
}else{
cout<<"errno="<<errno<<endl;
perror("xer.txt");//为了显示errno值。
}
会正确执行,但是errno==22;
所以若在open之后马上调用if(errno)则进入了错误处理。:
#define EIO 5 /* I/O error */
#define ENXIO 6 /* No such device or address */
#define E2BIG 7 /* Argument list too long */
#define ENOEXEC 8 /* Exec format error */
#define EBADF 9 /* Bad file number */
#define ECHILD 10 /* No child processes */
#define EAGAIN 11 /* Try again */
#define ENOMEM 12 /* Out of memory */
#define EACCES 13 /* Permission denied */
#define EFAULT 14 /* Bad address */
#define ENOTBLK 15 /* Block device required */
#define EBUSY 16 /* Device or resource busy */
#define EEXIST 17 /* File exists */
#define EXDEV 18 /* Cross-device link */
#define ENODEV 19 /* No such device */
#define ENOTDIR 20 /* Not a directory */
#define EISDIR 21 /* Is a directory */
#define EINVAL 22 /* Invalid argument */
#define ENFILE 23 /* File table overflow */