2017-02-09 7 views
1

stderrがコンソールに接続されているときと、ファイル/パイプにリダイレクトされているときとで、プログラムの動作が異なるようにしたい。 Unixシステムでは、私はちょうどisatty(STDERR_FILENO)をテストすることができますが、Windowsではどうしたらいいですか? MSVCRTには_isattyという名前の関数もあり、正しく機能しません(たとえば、Detect NUL file descriptor (isatty is bogus))。テストするために呼び出すことができるWindows APIまたはNT APIはありますか?Windowsでstderrがリダイレクトされているかどうかを確認するには?

+1

CとC++は異なる言語です。あなたはどちらを使いますか? – Olaf

+1

@Olaf:それは問題ではありません。 Windows APIは、CとC++の両方から使用できます。 CまたはC++で解決策を求めるのが標準的な方法です(違いはありません)。 – IInspectable

+0

@IInspectable:WinAPIの問題であれば、Cバインディングを使用しているので、Cの問題です。 – Olaf

答えて

3
  1. stderrハンドルを取得するには、GetStdHandleを呼び出します。
  2. そのハンドルをGetFileTypeに渡して、そのファイルの種類を確認します。
  3. FILE_TYPE_CHARが返された場合、stderrはコンソールになる可能性がありますが、確認するにはGetConsoleModeを呼び出します。
  4. GetConsoleModeが失敗した場合、stderrはプリンタなどの別の文字デバイスにリダイレクトされています。
+0

[提案された複製](http://stackoverflow.com/q/40709193/1889329)で説明されているように、これでは不十分です。 – IInspectable

+0

ハンドルが文字デバイスでない場合、 'GetConsoleMode'は成功しますか?そうでなければ、 'GetFileType'は冗長です。 –

0

は私にとっては、最も簡単な方法は、stderrをファイルにリダイレクトされ、<>0stderr場合がリダイレクトされていない場合0を返しfseek(stderr, 0, SEEK_CUR)を使用することでした。

関連する問題