从多个方面详细阐述stderr

发布时间:2023-05-20

一、基础知识

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 函数输出系统错误信息,并自动将错误信息附加在传递给它的参数后面。