Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to tell if stderr is directing output to a file?

Tags:

c++

c

unix

stderr

pipe

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

like image 993
stonea Avatar asked May 18 '09 21:05

stonea


2 Answers

Try using isatty() on the file descriptor:

The isatty() function determines if the file descriptor fd 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.

like image 191
winden Avatar answered Oct 04 '22 20:10

winden


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
like image 34
Adam Rosenfield Avatar answered Oct 04 '22 20:10

Adam Rosenfield