Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
登录C打印到stdout和stderr,无重复_C_Logging_Stdout_Stderr - Fatal编程技术网

登录C打印到stdout和stderr,无重复

登录C打印到stdout和stderr,无重复,c,logging,stdout,stderr,C,Logging,Stdout,Stderr,我已经为我的C命令行程序实现了我自己的消息记录功能,我希望能够将信息消息打印到stdout,将错误消息打印到stderr,并将警告消息打印到两者,如果它们输出到同一位置,则不会有重复的消息 信息和错误消息工作正常,但对于警告消息,我不知道如何有效地检查stdout和stderr文件流是否指向相同的输出位置。我的代码可以工作,但我不知道为什么,因为从逻辑上讲,当逐步执行函数时,如果stdout和stderr指向同一个文件,它应该会产生重复的条目 我已经检查了当stdout和stderr具有相同的输

我已经为我的C命令行程序实现了我自己的消息记录功能,我希望能够将信息消息打印到
stdout
,将错误消息打印到
stderr
,并将警告消息打印到两者,如果它们输出到同一位置,则不会有重复的消息

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

我已经检查了当
stdout
stderr
具有相同的输出文件时,它们仍然在指针中生成不同的内存地址,
fileno(stdout)
fileno(stderr)
是不同的

tl;博士,我有代码,但据我所知。。。不应该。有人能解释一下它为什么会起作用,或者有人知道解决这个问题的正确方法吗

编辑:我调用程序的方式是:
myProgram>out.lis2>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

诀窍是fstat()

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

恐怕我不能告诉你Windows小姐是否有相同的电话,但它应该有一个相同的电话

别忘了适当地冲洗

编辑: 注释只需检查两个字段。这是正确的(除了一些奇怪的文件系统)

可能会发生一些奇怪的事情。如果同一设备有两个设备节点(如/dev/tty1和/dev/tty1_alternate中指向同一设备),则st_ino将不匹配,但st_rdev将匹配。我会将这些视为不同的,因为用户正在与您玩游戏

最好尝试检查两个打开是否相同。 (处理
myprogram>out 2>out
案例。)
为此,您可能需要处理一些参数,看看更改一个参数是否会更改另一个参数。可能是fcntl()函数,使用F_GETFL和F_SETFL。

技巧是fstat()

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

恐怕我不能告诉你Windows小姐是否有相同的电话,但它应该有一个相同的电话

别忘了适当地冲洗

编辑: 注释只需检查两个字段。这是正确的(除了一些奇怪的文件系统)

可能会发生一些奇怪的事情。如果同一设备有两个设备节点(如/dev/tty1和/dev/tty1_alternate中指向同一设备),则st_ino将不匹配,但st_rdev将匹配。我会将这些视为不同的,因为用户正在与您玩游戏

最好尝试检查两个打开是否相同。 (处理
myprogram>out 2>out
案例。) 为此,您可能需要处理一些参数,看看更改一个参数是否会更改另一个参数。可能是fcntl()函数,使用F_GETFL和F_SETFL。

中提到的A可以用来检查文件描述符的真正写入位置

在POSIX系统上,您可以使用成员
st_dev
st_ino
来查找所使用的文件。如果这两个成员对于
stdout
stderr
都相等,那么您正在写入同一个文件

我还建议您在计划的早期只进行一次检查。重定向只发生一次,您不需要每次编写消息时都检查重定向。

中提到的a可用于检查文件描述符的实际写入位置

在POSIX系统上,您可以使用成员
st_dev
st_ino
来查找所使用的文件。如果这两个成员对于
stdout
stderr
都相等,那么您正在写入同一个文件


我还建议您在计划的早期只进行一次检查。重定向只发生一次,您不需要每次编写消息时都检查重定向。

您的代码(部分)可以工作,因为如果
isatty(fileno(stderr))
为“true”(通常情况下),则根本不打印到
stdout
。如果在打印到
stderr
stdout
时,
stderr
未连接到终端(但例如连接到管道),则代码将中断。FWIW,对于命令行工具来说,这是一件非常罕见的事情,用户可能会感到惊讶。我会重新考虑你是否想这么做。我认为这在一般情况下是不可能的:如果我让stdout直接进入终端,但通过
cat
重定向stderr怎么办?这两条线仍然会连接到终端,但您的程序无法知道。而且,您只能可靠地、可移植地检查
stderr
stdout
是否都连接到终端。如果两者都不是,那么就没有(可移植的)方法知道两者是否使用相同的管道/文件/etc。是的,我看不到它在工作