Как определить, что stderr направляет вывод в файл? - PullRequest
4 голосов
/ 19 мая 2009

Есть ли способ узнать, выводит ли stderr файл или терминал в программе C / C ++? Мне нужно вывести другое сообщение об ошибке в зависимости от того, вызывается ли программа как:

. / Программа

или как:

. / Программа 2 >> файл

Ответы [ 2 ]

11 голосов
/ 19 мая 2009

Попробуйте использовать isatty() в дескрипторе файла:

Функция isatty() определяет, дескриптор файла fd относится к допустимое устройство типа терминала.

Функция fileno() проверяет поток аргументов и возвращает его целочисленный дескриптор.

Обратите внимание, что stderr всегда присутствует в файловом дескрипторе 2, поэтому вам не нужно fileno() в этом конкретном случае.

10 голосов
/ 19 мая 2009

Да, вы можете использовать isatty(3), чтобы определить, относится ли дескриптор файла к терминалу или к чему-то еще (файлу, каналу и т. Д.). Дескриптор файла 0 - stdin, 1 - stdout, а 2 - stderr.

if(isatty(2))
    // stderr is a terminal
...