1.错误检查
函数执行失败时,一般都会返回一个特定的值比如-1,空指针,这些只能说明有错误发生,但具体的错误原因却没有说明,在头文件erron.h中定义变量errno(错误码),可以通过错误码,得到错误的描述信息. 程序开始执行时,errno被初始化为0,很多库函数在执行过程中遇到错误时将errno设置为相应的错误码,函数被调用成功时,它们不修改errno的值,所以不能根据errno的值来判断一个函数是否执行成功,当函数执行失败时,errno的值才有意义. 错误码是一些定义在errno.h中的宏,通常以字母E开头,下面是一些常见的错误码解释:
- ENOMEM:表示内存不足,系统不能再提供更多的虚拟内存.
- EIO:输入输出错误,在读写磁盘时经常遇到.
- ENXIO:指定的设备或地址不存在.
- EPERM:禁止操作,只有具备相应权限的进程才能执行该操作.
- ESRCH:没有经常与给定的进程ID相匹配.
- ENOENT:文件或目录不存在;
- EINTR:函数调用被中断,如果发生这种错误,要重新调用函数.
- E2BIG:参数过长;
- ENOEXEC:可执行文件格式无效.
- EBADF:文件描述符错误;
- ECHILD:子进程不存在;
- EBUSY:资源正在占用,不能共享.
- EINVAL:无效的参数.
- EMFILE:当前进程打开的文件已达到上限,不能在打开其它文件.
- EFBIG:文件太大;
- ENOTDIR:当需要目录时指定了一个非目录的文件.
- EISDIR:文件是一个目录;
函数strerror和函数perror可以通过错误码获取标准的错误信息提示: strerrror在头文件string.h中申明: #include <string.h> char * strerror(int errnum); strerror函数根据参数errnum提供的错误码来获取一个描述符的错误信息提示, perror()函数申明在头文件<stdio.h>中; perror()打印错误信息到stderr,调用perror时,如果参数message是一个空指针 ,perror仅仅根据errno打印出对应的错误信息提示,如果提供一个非空的值 ,perror会把message加在其输出信息的前面.来看个例子:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> FILE *open_file(char *filename) { FILE *stream; errno=0; stream=fopen(filename,"r"); if(stream==NULL) { printf("不能打开文件%s!,原因:%s\n",filename,strerror(errno)); exit(-1); } else { return stream; } } int main(void) { char *filename = "test"; open_file(filename); return 0; }
结果:L
yang@liu:~/syc/第八章$ ./a.out 不能打开文件test!,原因:No such file or directory