errno、stderr、perror函数和strerror函数

  1. errno表示错误代码。 记录系统的最后一次错误代码。代码是一个int型的值,在errno.h中定义。系统每一次出错都会对应一个出错代码,例如12表示“Cannot allocate memory"。

  2. stderr是linux(unix)标准出错输出。linux中的一个进程启动时,都会打开三个文件:标准输入、标准输出和标准出错处理。通常这三个文件都与终端联系。这三个文件分别对应文件描述符0、1、2。系队统自定义了三个文件指针stdin、stdout、stderr,分别指向标准输入、标准输出和标准出错输出。通常结合fprintf使用:fprintf(stderr,"error message")。

  3. perror是错误输出函数,在标准输出设备上输出一个错误信息。是对errno的封装。例如perror("fun"),其输出为:fun:后面跟着错误信息(加一个换行符)。包含头文件stdio.h.

  4. stderror是通过参数errno,返回错误信息。即stderror(errno),可用printf函数打印出错信息,用于调试。包含头文件string.h。

测试代码

/*

 *时间:2012.03.11

 *功能:测试errno、perror、strerror和stderr

 *目的:验证linux下出错处理

*/

#include 

#include 

#include 

#include 



int main(int argc[],char *argv[])

{
malloc(1);

printf("errno = %d\n",errno);

fprintf(stderr,"stderr\n");

perror("perror");

printf("strerror: %s\n",strerror(errno));



malloc(-1);

printf("errno = %d\n",errno);

fprintf(stderr,"stderr\n");

perror("perror");

printf("strerror: %s\n",strerror(errno));



return 0;

}


运行结果




3、strerror与perror、fprintf(stderr...和printf(stderr....在输出重定向下的差别

3.1    strerror()方法与perror()的用法十分相似。


    先谈谈perror()的用法,这个方法用于将上一条语句(方法)执行后的错误打印到标准输出上。一般情况下(没有使用重定向的话),就是输出到控制台上。  

但是,如果我需要了解另外一个进程的某一个方法执行的错误,或者更briefly,我就希望将错误打印到一个文件里面,perror()就不太合适了!  

为了实现我刚刚说到的要求,我们首先要将错误放到一个字符串里面。这个时候,strerror()就合适了!  

strerror(errno)  

    首先,系统会根据上一条语句的执行错误情况,将errno赋值.。关于这点,我们首先明白两点。第一,errno是一个系统变量,是不需要我们赋值或者声明的。第二,errno是一个int类型的变量,而且其中的值对应一种特定错误类型  

然后,关于streorror()本身,可以这么理解。顾名思义,streorror=string+error,就是将errno值翻译成描述错误类型的string语句!




3.2 fprintf printf

一般情况下,你这两个语句运行的结果是相同的,没有区别,只有一下情况才有区别:

运行你的程序的时候,命令行上把输出结果进行的转向,比如使用下面的命令把你的程序a.c运行的结果转向到记事本文件a.txt:
a.exe > a.txt

在这样的情况,如果使用printf输出错误信息,会保存到a.txt文件里面,如果使用fprintf输出错误,会显示在屏幕上

你可能感兴趣的:(linux系统编程,C/C++,语言)