2017-02-09 110 views
1

我希望我的程序在stderr连接到控制台和重定向到文件/管道之间有不同的行为。在Unix系统中,我只能测试isatty(STDERR_FILENO),但我如何在Windows中执行此操作? MSVCRT也有一个名为_isatty的功能,它不能正常工作(例如,Detect NUL file descriptor (isatty is bogus))。是否有任何Windows或NT API我可以打电话来测试它?如何判断stderr是否已在Windows中重定向?

+1

C和C++是不同的语言。你使用哪个? – Olaf

+1

@Olaf:没关系。 Windows API可以从C和C++中使用。在C或C++中寻求解决方案(这没有什么不同)是标准做法。 – IInspectable

+0

@IInspectable:如果这是WinAPI的问题,它使用C绑定,因此它是一个C问题。 – Olaf

回答

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

这是不够的,正如[建议的重复](http://stackoverflow.com/q/40709193/1889329)中所述。 – IInspectable

+0

如果句柄不是字符设备,'GetConsoleMode'会成功吗?如果不是,那么'GetFileType'是多余的。 –

0

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

相关问题