调用库函数之后检查errno《C专家编程》

来源:互联网 发布:如何设置淘宝客优惠券 编辑:程序博客网 时间:2024/04/30 09:28

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=0int 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 */




0 0
原创粉丝点击