The following C file gives a bogus result when NUL is piped to it:
int main()
{
printf("_isatty = %d\n", _isatty(0));
}
the result is:
C:\Users\Edward\Dev\nulltest> test.exe < NUL
_isatty = 64
I'm pretty sure NUL (aka /dev/null) is not a terminal device! So I need to detect in another way whether or not the file descriptor corresponds to NUL. The number doesn't have any specific meaning; I see it when I actually do have a terminal attached.
What should I do? This question suggests using a sketchy undocumented function to get the underlying name, presumably comparing it to NUL, but that feels less than ideal to me. Is there a better way?
P.S. This would help solve this GHC bug.
Here is a possible solution, but I'm not convinced it works all the time. I believe it will work for the specific case of a NUL file descriptor:
From msdn:
NUL is like /dev/null on Unix, it's a char device.
Note that on Linux, isatty is different:
What you can do is try to compare STDIN_FILENO (0) with ${cwd}/NUL (using stat or stat).
Update:
It will return FILE_TYPE_CHAR for NUL or tty.
See GetFileType documentation for other values. You can detect files/char device/pipes.
Update Final:
Use GetConsoleMode for input and GetConsoleScreenBufferInfo for output.
You can use
fstat
on the file descriptor and compare the device member of the resultingstat
structure with that for/dev/null
and see if they match.