如何检测何时重定向输出?

时间:2010-01-18 17:09:26

标签: winapi redirect console-application

我有一个用C语言编写的Win32应用程序,它的控制台输出可以通过printf()重定向到日志文件。

如果我能拥有自己的应用程序,那就太好了。检测是否已启动或不启用重定向'>'。

有什么想法吗?

5 个答案:

答案 0 :(得分:5)

汤姆,谢谢你的意见。

我做了一些实验,发现这对我有用..

fpost_t pos ;

fgetpos (stdout, & pos) ;

当应用程序的输出被重定向到文件时,fgetpos()将'pos'设置为零。它是新的开放的stderr为你有意义。 编辑:实际上,如果文本已经重定向到日志/文件,则返回的值可能是正整数。所以在你的代码中你会有类似“if(pos> = 0)bfRedirected = TRUE;”

当应用程序的输出未被重定向时 - 它将转到控制台设备 - 而不是文件,因此fgetpos()会将'pos'设置为-1。

答案 1 :(得分:2)

我认为管道本质上是盲目的,所以你没有内置的方法来判断你是否被重定向。此外,试图找出抽象层背后发生的事情是一个坏习惯。

如果您确实需要控制输出,请将日志文件名添加为命令行参数!

话虽这么说,你可以做一些聪明的猜测来找出:

  • 程序可以查询shell命令历史记录以找出最近执行的命令。
  • 如果您知道日志文件的路径,则可以扫描该目录,查看文件是否已创建或更改其大小。
  • 重定向但未重定向时的基准写入速度。只有当您的系统超稳定且环境条件不会改变时,这才有效。

答案 2 :(得分:1)

可能有一种方法可以做到这一点 - 快速google产生了这个hit,可能会给你正确的方向提示。

答案 3 :(得分:0)

AFAIK对此的答案是你做不到的。输出重定向通过简单地读取给定程序的输出流并将其重定向到另一个管道/流来工作。文件/流的设计使得作者对读者一无所知,以至于你不应该知道你正在阅读。

即使检测到有读者也没用,因为在正常情况下有一个读者。控制台正在读取程序的输出并将其显示在屏幕上。

答案 4 :(得分:0)

Microsoft的方法:WriteConsole如果与重定向到文件的标准句柄一起使用,则会失败。如果应用程序处理可以重定向的多语言输出,请确定输出句柄是否是控制台句柄(一种方法是调用GetConsoleMode函数并检查它是否成功)。