perror函数和strerror函数的区别

首先简单说一下file descriptors(文件描述符)
      file descriptor 0是standard input (stdin标准输入)
      file descriptor 1 是 standard output (stdout标准输出)
      file descriptor 2 是 standard error output(stderr标准错误输出)

 

 

perror()原型:

 

#include <stdio.h>
void perror(const char *msg);
它是基于errno的当前值,在标准出错上产生一条出错信息,然后返回。它首先输出由msg指向的字符串,然后是一个冒号,一个空格,接着是对应于errno值的出错信息,最后是一个换行符。

 

strerror()原型:

 

#include <string.h>
char * strerror(int errnum);
此函数将errnum(它通常就说errno值)映射为一个出错信息字符串,并返回此字符串的指针。

 

区别:
查看man手册,

perror是将errno对应的错误消息的字符串打印到标准错误输出上,即stderr或2上,若你的程序将标准错误输出重定向到/dev/null,那就看不到了,就不能用perror了。而 strerror的作用只是将errno对应的错误消息字符串返回,要怎样处理完全由你自己决定。通常我们选择把错误消息保存到日志文件中,即写文件,所以通常可以用fprintf(fp, "%s", strerror(errno))将错误消息打印到fp指向的文件中。其中perror中errno对应的错误消息集合跟strerror是一样的,也就是说不会漏掉某些错误。

 

可以通过一个程序示例下:

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>

int main(int argc,char *argv[])
{
        FILE * fp;

        if((fp = fopen(argv[1],"r"))==NULL)
        {
                perror("perror");
                printf("fork error:%s\n",strerror(errno));
                exit(1);
        }
        perror("perror");
        printf("fork error:%s\n",strerror(errno));

        return 0;
}

 

 

运行测试如下:

 

zjf@zjf:~/work/code/procise/application/chapter_1$ ./a.out 
perror: Bad address
fork error:Bad address
zjf@zjf:~/work/code/procise/application/chapter_1$ ./a.out 2> file
fork error:Invalid argument

 

 

 

posted @ 2012-12-16 23:44  wust.zjf  阅读(4399)  评论(0编辑  收藏  举报