一、基础知识
stderr
,全称为 standard error,是 Unix 和类 Unix 操作系统中的标准输出流之一。与标准输出流 stdout
不同,它通常用于输出错误信息。
在程序运行时,输出通常被分为两类:标准输出和标准错误输出。标准输出用于输出普通信息,标准错误输出则用于输出错误信息。这样,在程序运行出现错误时,我们不必再去查看日志,错误信息可以直接在控制台或终端上输出。
#include <stdio.h>
int main() {
fprintf(stderr, "This is an error message.\n");
return 0;
}
上面的 C 语言代码演示了如何在程序中使用 stderr
输出错误信息,通过 fprintf
函数将错误信息输出到 stderr
中。
二、使用场景
在程序开发和调试过程中,我们经常需要使用 stderr
输出一些错误信息。一般来说,只有在程序发生错误时才输出错误信息。同时,在编写可重用的函数库时,可以尝试通过 stderr
输出一些有关于错误的描述信息。
当然,有时候我们也可以使用 stdout
输出一些调试信息,但是这样做有一个缺点,即可能会与程序的标准输出混淆。因此,为了更好地区分标准输出和调试信息,通常情况下我们使用 stderr
来输出错误信息。
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
return 1;
}
// do something
return 0;
}
上面的 C 语言代码演示了如何在程序中使用 stderr
输出错误信息,比如在没有传递文件名作为命令行参数时输出使用说明。
三、重定向 stderr
有时候,我们可能需要将程序中的错误信息输出到文件中,而不是输出到控制台或终端上。为此,我们可以使用重定向技术,将 stderr
输出到指定的文件中。
在 Unix 和类 Unix 操作系统中,可以使用以下命令将 stderr
输出重定向到指定的文件中:
./program 2> error.log
这样,程序中的所有错误信息都会被输出到 error.log
文件中。
在 C 语言中,可以使用 freopen
函数将 stderr
输出重定向到指定的文件中:
#include <stdio.h>
int main() {
FILE *fp = freopen("error.log", "w", stderr);
if (fp == NULL) {
printf("Failed to open error.log.\n");
return 1;
}
fprintf(stderr, "This is an error message.\n");
fclose(fp);
return 0;
}
上面的代码演示了如何将 stderr
输出重定向到 error.log
文件中,并输出一条错误信息。
四、结合 perror 函数
perror
函数可以用于输出系统错误信息,并且自动将错误信息附加在传递给它的参数后面。该函数自动将 errno
变量指向的错误码对应的描述信息输出到 stderr
中。
#include <stdio.h>
#include <errno.h>
int main() {
FILE *fp = fopen("file.txt", "r");
if (fp == NULL) {
perror("Failed to open file.txt");
return errno;
}
// do something
fclose(fp);
return 0;
}
上面的代码演示了如何结合 perror
函数输出系统错误信息。如果打开文件失败,调用 perror
函数输出错误信息,并返回 errno
变量中存储的错误码。
五、总结
stderr
是 Unix 和类 Unix 操作系统中的标准错误输出流。在程序开发和调试中,我们经常需要使用 stderr
输出一些错误信息。同时,通过重定向技术,我们可以将 stderr
输出到指定的文件中。在 C 语言中,可以使用 perror
函数输出系统错误信息,并自动将错误信息附加在传递给它的参数后面。