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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM