Как я могу определить, на что stdout "указывает" в C? - PullRequest
3 голосов
/ 12 сентября 2011

Я хочу иметь возможность определить, когда стандартный вывод моей программы перенаправляется в файл / устройство, и когда он остается для обычной печати на экране.Как это можно сделать в C?

Обновление 1 : Судя по комментариям, это зависит от системы.Если это так, то как это можно сделать с помощью posix-совместимых систем?

Ответы [ 5 ]

5 голосов
/ 12 сентября 2011

Возможно isatty(stdout)?

Редактировать : Как подсказывают Роланд и Трипли, лучшим ответом будет isatty(STDOUT_FILENO).

3 голосов
/ 12 сентября 2011

Посмотрите вверх isatty и в целом fileno.

3 голосов
/ 12 сентября 2011

Боюсь, что вы не можете, по крайней мере, со стандартным C независимо от платформы. Идея стандартного ввода / вывода состоит в том, что C будет делать IO из стандартного места. Это стандартное место может быть терминалом, файлом или чем-то еще, это не относится к C. Поэтому вы не можете определить, какой стандартный IO используется в настоящее время.

РЕДАКТИРОВАТЬ: Если решение для платформы подходит для вас, пожалуйста, обратитесь к другим ответам (а также отредактируйте вопрос соответственно).

2 голосов
/ 12 сентября 2011

Если решение для Linux в порядке, вы можете проверить символические ссылки в каталоге /proc для вашего процесса.Например,

$ exec 3>/dev/null
$ ls -l /proc/$$/fd
total 0
lrwx------ 1 root root 64 Sep 12 03:28 0 -> /dev/pts/1
lrwx------ 1 root root 64 Sep 12 03:29 1 -> /dev/pts/1
lrwx------ 1 root root 64 Sep 12 03:29 2 -> /dev/pts/1
lrwx------ 1 root root 64 Sep 12 03:29 255 -> /dev/pts/1
l-wx------ 1 root root 64 Sep 12 03:29 3 -> /dev/null
0 голосов
/ 12 сентября 2011

Вы можете проверить это:

http://www.cplusplus.com/reference/clibrary/cstdio/freopen/

Я цитирую по ссылке:

freopen

Reopen stream with different file or mode
freopen first tries to close any file already associated with the stream given as third parameter and disassociates it.
Then, whether that stream was successfuly closed or not, freopen opens the file whose name is passed in the first parameter, filename, and associates it with the specified stream just as fopen would do using the mode value specified as the second parameter.
This function is specially useful for redirecting predefined streams like stdin, stdout and stderr to specific files.

Хотя я не уверен, еслиэто поможет вам выяснить, на что именно оно указывает.

...