【转载】在使用上perror和strerror应注意的地方

     在调用某些库函数出错时,通常需要将错误信息打印出来,有的程序用perror(print error)打印,有的用strerror打印,到底他们之间有什么区别呢?
  man手册里面写的很清楚,perror是将errno对应的错误消息的字符 串打印到标准错误输出上,即stderr或2上,若你的程序将标准错误输出重定向到/dev/null,那就看不到了,就不能用perror了。而 strerror的作用只是将errno对应的错误消息字符串返回,要怎样处理完全由你自己决定。
  通常我们选择把错误消息保存到日志文件中,即写文件,所 以通常可以用fprintf(fp, "%s", strerror(errno))将错误消息打印到fp指向的文件中。其中perror中errno对应的错误消息集合跟strerror是一样的,也就 是说不会漏掉某些错误。 

#include <stdio.h> // void perror(const char *msg);

#include <string.h> // char *strerror(int errnum);

#include <errno.h> //errno

 

errno是错误代码,在errno.h头文件中

void perror(const char *s)

perror是错误输出函数,在标准输出设备上输出一个错误信息。

参数s一般是参数错误的函数

 

例如perror("fun"),其输出为:fun:后面跟着错误信息(加上一个换行符)

char *strerror(int errnum);通过参数errnum(也就是errno),返回错误信息

 

以下是测试程序:

//程序名:errtest.c,环境为linux

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main(int argc,char *argv[]){
FILE *fp;
char *buf;
if((fp=fopen(argv[1],"r"))==NULL)
{
perror("perror");
printf("sterror:%s\n",strerror(errno));
exit(1);
}
perror("perror");
errno=13;
printf("strerror:%s\n",strerror(errno));
fclose(fp);
return 0;
}

==============================

编译为errtest

如果输入这样的命令格式:./errtest 111.c(其中111.c不存在)

输出为:

perror: No such file or directory
sterror:Illegal seek

就是两个都是输出到屏幕上来了。而且sterror函数通过errno得到错误代码

如果命令格式为:./errtest 111.c > out.c(其中111.c不存在)

把输出重定位到out.c文件中,会发现屏幕输出为:

perror: No such file or directory
就是说函数perror始终输出到标准输出设备上。而printf输出到文件中了

posted @ 2012-10-25 23:23  chkpk  阅读(298)  评论(0编辑  收藏  举报