C语言库函数 strerror perror 的使用
1. strerror 的使用
写代码时需要判断函数返回值的状态,来做进一步的处理,提高程序的健壮性,比如打开一个文件出错,就要根据返回值做进一步的处理
例如下面的代码
int fd = open("./error.c", O_RDONLY);
if(-1 == fd){
printf("open ./error.c error!\n");
return 0;
}
这段代码linux系统上使用系统函数open打开一个文件,如果文件不存在或其他的错误返回值就是个-1,就不能确定到底什么原因导致的错误。C库刚好提供了一个strerror 函数 ,需要#include <strerrno.h> 头文件,errno 是一个全局变量,直接使用,errno只是获取错误的值,需要结合strerror函数,解析出错误的原因。
int fd = open("./error.c", O_RDONLY);
if(-1 == fd){
printf("errno=%s\n",strerror(errno));
printf("open ./error.c error!\n");
return 0;
}
当文件没有权限时,报如下错误
errno=Permission denied
open ./error.c error!
通过ls -al查看文件权限问题,的确是没有权限
ls error.c -al
--w--w---- 1 huangcheng huangcheng 0 Mar 21 12:19 error.c
errno一共有134个不同的值,下面列举部分
#define EPERM 1 /* Operation not permitted */
#define ENOENT 2 /* No such file or directory */
#define ESRCH 3 /* No such process */
#define EINTR 4 /* Interrupted system call */
#define EIO 5 /* I/O error */
......
#define ENOTRECOVERABLE 131 /* State not recoverable */
#define ERFKILL 132 /* Operation not possible due to RF-kill */
#define EHWPOISON 133 /* Memory page has hardware error */
2. perror的使用
perror 直接显示错误的原因,用于在发生系统调用错误时输出有关错误信息的描述,使用比较简单,直接来开示例代码,这个文件还是由于权限问题无法打开
int fd = open("./error.c", O_RDONLY);
if(-1 == fd){
//printf("errno=%s\n",strerror(errno));
perror("perror:");
printf("open ./error.c error!\n");
return 0;
}
和strerror使用效果一样
perror:: Permission denied
open ./error.c error!