Is there a way I can tell whether stderr is outputting to a file or the terminal within a C/C++ program? I need to output different error message depending on whether the program is invoked as:
./program
or like:
./program 2>> file
Is there a way I can tell whether stderr is outputting to a file or the terminal within a C/C++ program? I need to output different error message depending on whether the program is invoked as:
./program
or like:
./program 2>> file
Yes, you can use isatty(3)
to tell if a file descriptor refers to the terminal or to something else (file, pipe, etc.). File descriptor 0 is stdin
, 1 is stdout
, and 2 is stderr
.
if(isatty(2))
// stderr is a terminal
Try using isatty()
on the file descriptor:
The
isatty()
function determines if the file descriptorfd
refers to a valid terminal type device.The function
fileno()
examines the argument stream and returns its integer descriptor.
Note that stderr
is always on file descriptor 2, so you don't really need fileno()
in this exact case.