如何在Windows中判断stderr是否已被重定向?

3
我希望我的程序在标准错误连接到控制台和重定向到文件/管道时有不同的行为。在Unix系统中,我可以测试isatty(STDERR_FILENO),但是在Windows中该怎么办呢? MSVCRT也有一个名为_isatty的函数,但它无法正常工作(例如,检测NUL文件描述符(isatty虚假))。是否有任何Windows或NT API可以调用来测试它?

1
C和C++是不同的编程语言。你使用哪一个? - too honest for this site
1
@Olaf:没关系。Windows API 可以从 C 和 C++ 中使用。通常习惯于要求用 C 或 C++ 提供解决方案(这没有区别)。 - IInspectable
@IInspectable:如果这是关于WinAPI的问题,它使用C绑定,因此是一个C语言的问题。 - too honest for this site
你链接的问题中被接受的答案已经给出了解决方案,只需要使用STD_ERROR_HANDLE代替STD_OUTPUT_HANDLE即可。 - Ian Abbott
2个回答

4
  1. 调用GetStdHandle获取标准错误句柄。
  2. 将该句柄传递给GetFileType,以查找文件类型。
  3. 如果返回FILE_TYPE_CHAR,则标准错误可能是控制台,但需要调用GetConsoleMode进行检查。
  4. 如果GetConsoleMode失败,则标准错误已被重定向到另一个字符设备,例如打印机。

这还不够,正如提出的重复问题中所解释的那样。 - IInspectable
如果句柄不是字符设备,那么GetConsoleMode是否会成功?如果不会,那么GetFileType就是多余的。 - Siyuan Ren

1
对我来说,最简单的方法是使用 fseek(stderr, 0, SEEK_CUR),如果 stderr 被重定向到文件,则返回 0,否则返回 <>0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接