在C打印中登录到stdout和stderr,没有重复项

问题描述 投票:1回答:1

我已经为我的C命令行程序实现了自己的消息记录功能,我希望能够将Info消息打印到stdout,将Error消息打印到stderr,并将Warning消息打印到这两个消息,如果它们没有重复的消息,输出到同一位置。

信息和错误消息工作正常,但是对于警告消息,我不知道如何有效地检查stdout和stderr文件流是否指向相同的输出位置。我的代码有效,但是我不知道为什么,因为从逻辑上讲,当stdoutstderr指向同一文件时,逐步执行该函数应会产生重复的条目。

我已经检查了stdoutstderr具有相同的输出文件,但它们在指针中仍然产生不同的内存地址,并且fileno(stdout)fileno(stderr)不同。

tl; dr我有可以使用的代码,但据我所知...不应该。任何人都可以帮助解释为什么它起作用,或者有人知道解决此问题的正确方法。

编辑:我调用程序的方式是:myProgram >out.lis 2>out.lis

编辑2:当这样调用时,它确实会产生重复:myProgram >out.lis 2>&1

我的警告消息代码:

/* Warning message, a unified function for printing warning messages */
/* Warning messages are printed to both the output log and the error log (if different) */
void warningMessage(char * msg) {
    if (isatty(fileno(stderr))) {
        /* Add color if printing to terminal */
        fprintf(stderr, "\033[0;31;43mWarning: \033[0;30;43m%s\033[39;49m\r\n", msg);
    } else {
        fprintf(stderr, "\nWarning: %s\n", msg);

        if (isatty(fileno(stdout))) {
            fprintf(stdout, "\033[0;31;43mWarning: \033[0;30;43m%s\033[39;49m\r\n", msg);
        } else {
            fprintf(stdout, "\nWarning: %s\n", msg);
        }
    }
}

关于我的代码的任何其他指针也将有所帮助!我只是最近才开始学习C!

c logging stdout stderr
1个回答
0
投票

诀窍将是fstat()。

获取两个文件的文件名(分别为1和2,但对于非Unix操作系统可能不同),将它们作为第一个参数传递给fstat(),并比较填充的结构作为第二个参数。如果它们输出到相同的地方,我会期望完全匹配。我可以相信时间戳记可能会有所不同。

恐怕我不能告诉您MS-Windows是否具有相同的调用,但它应该具有相同的调用。

不要忘记适当冲洗。

© www.soinside.com 2019 - 2024. All rights reserved.