2016-02-19 2 views
3

Есть ли какая-то магия, которую я могу сделать с dup2 (или fcntl), так что я перенаправляю stdout в файл (т. Е. Все, что написано в дескрипторе 1, будет идти в файл), но если я использовал какой-то другой механизм, он пойдет на вывод терминала? Так свободно:Duplicate, но все еще использовать stdout

int original_stdout; 
    // some magic to save the original stdout 
    int fd; 
    open(fd, ...); 
    dup2(fd, 1); 
    write(1, ...); // goes to the file open on fd 
    write(original_stdout, ...); // still goes to the terminal 
+0

Ваша точка? –

+2

Возможно, я неправильно понял, но почему бы просто не сделать функцию, которая либо записывает в stdout, либо файл в зависимости от логического параметра? –

+0

Пункт? Я не вижу, чтобы он задумывался, я вижу, что он задает вопрос. Могу ли я перенаправить STDOUT в файл и в другое время в другое место программно. –

ответ

5

Простой вызов dup выполнит сохранение. Вот рабочий пример:

#include <stdio.h> 
#include <unistd.h> 
#include <fcntl.h> 

int main() 
{ 
    // error checking omitted for brevity 
    int original_stdout = dup(1);     // magic 
    int fd = open("foo", O_WRONLY | O_CREAT); 
    dup2(fd, 1); 
    write(1, "hello foo\n", 10);     // goes to the file open on fd 
    write(original_stdout, "hello terminal\n", 15); // still goes to the terminal 
    return 0; 
} 
+2

Возможно, вы захотите пойти с 'STDOUT_FILENO', а не магическими числами. – EOF

+0

@EOF Идея заключалась в том, чтобы сохранить как можно больше исходного кода, который использовал числовые константы. Кроме того, в контексте Unix символическая константа эквивалентна написанию номера. Числовые ссылки на дескрипторы файлов регулярно производятся из оболочек и языков сценариев. – user4815162342

+0

Использование макроса 'STDOUT_FILENO' вместо' 1' для номера дескриптора сделает код более читаемым; Я считаю, что читаемость чрезвычайно важна. Что касается языков сценариев, я не согласен: например, 'awk' и' sed' не имеют понятия дескрипторов файлов. gawk и mawk поддерживают специальные имена '/ dev/stdin','/dev/stdout' и '/ dev/stderr' (даже в Windows). Эти языки сценариев, которые знают о дескрипторах файлов, унаследовали концепцию (и в основном интерфейс) от C и имеют именованные константы (например, Perl, Python). –

Смежные вопросы