如何检查stdout是否已被重定向到Windows上的NUL(在Linux上也称为/ dev / null)?

如何检查我的程序的stdout是否已重定向到NUL
这样我就可以避免输出数据,因为它毫无意义。

我主要需要这个用于Windows,但如果你有一个Linux解决方案,它可能对将来的其他人有所帮助,所以也可以随意发布。

可能有其他方法可以做到这一点(如果事实certificate它是一个我忽略的适当function,那就不足为奇了),但这是一种方式:

 enum { Output_Console, Output_File, Output_NUL, }; bool GetOutputHandleType(int* piType) { HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); if (h) { BY_HANDLE_FILE_INFORMATION fi; if (GetFileInformationByHandle(h, &fi)) { *piType = Output_File; return true; } if (GetLastError() == ERROR_INVALID_FUNCTION) { *piType = Output_NUL; return true; } if (GetLastError() == ERROR_INVALID_HANDLE) { *piType = Output_Console; return true; } } return false; } 

我自己弄清楚了。 它很烦人。

 #include  #include  #pragma comment(lib, "ntdll.lib") // can instead use GetProcAddress (below) extern "C" NTSTATUS __stdcall NtQueryVolumeInformationFile( HANDLE FileHandle, struct _IO_STATUS_BLOCK *IoStatusBlock, void *FsInformation, unsigned long Length, enum _FSINFOCLASS FsInformationClass); bool isdevnull(FILE *file) { struct FILE_FS_DEVICE_INFORMATION { unsigned long DeviceType, Characteristics; } fsinfo; struct { void *info, *status; } iosb; typedef NTSTATUS (__stdcall *PNTQIF)( HANDLE FileHandle, struct _IO_STATUS_BLOCK *IoStatusBlock, void *FsInformation, unsigned long Length, enum _FSINFOCLASS FsInformationClass); PNTQIF const ntqif = true // True if you have ntdll.lib, false otherwise ? NtQueryVolumeInformationFile : (PNTQIF) GetProcAddress( GetModuleHandle(TEXT("ntdll.dll")), "NtQueryVolumeInformationFile"); return ntqif( (HANDLE) _get_osfhandle(_fileno(stdout)), (struct _IO_STATUS_BLOCK *)&iosb, &fsinfo, sizeof(fsinfo), (enum _FSINFOCLASS)4 ) == 0 && fsinfo.DeviceType == 0x00000015 /*FILE_DEVICE_NULL*/; } int main() { bool b = isdevnull(stdout); }