-
errno表示错误代码。 记录系统的最后一次错误代码。代码是一个int型的值,在errno.h中定义。系统每一次出错都会对应一个出错代码,例如12表示“Cannot allocate memory"。
-
stderr是linux(unix)标准出错输出。linux中的一个进程启动时,都会打开三个文件:标准输入、标准输出和标准出错处理。通常这三个文件都与终端联系。这三个文件分别对应文件描述符0、1、2。系队统自定义了三个文件指针stdin、stdout、stderr,分别指向标准输入、标准输出和标准出错输出。通常结合fprintf使用:fprintf(stderr,"error message")。
-
perror是错误输出函数,在标准输出设备上输出一个错误信息。是对errno的封装。例如perror("fun"),其输出为:fun:后面跟着错误信息(加一个换行符)。包含头文件stdio.h.
-
stderror是通过参数errno,返回错误信息。即stderror(errno),可用printf函数打印出错信息,用于调试。包含头文件string.h。
-
测试代码
-
-
/*
-
-
*时间:2012.03.11
-
-
*功能:测试errno、perror、strerror和stderr
-
-
*目的:验证linux下出错处理
-
-
*/
-
-
#include <stdio.h>
-
-
#include <stdlib.h>
-
-
#include <errno.h>
-
-
#include <string.h>
-
-
-
-
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输出错误,会显示在屏幕上。