2017-02-09 75 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

相關問題