Как перенаправить стандартный вывод обратно в окно терминала - PullRequest
3 голосов
/ 20 февраля 2011

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

Весь код написан на C. Программа работает в Ubuntu.

Любое понимание того, что должно быть сделано?

Ответы [ 2 ]

5 голосов
/ 20 февраля 2011

Я предполагаю, что вы начинаете со стандартного вывода без направления.Затем вы закрываете исходный стандартный вывод и снова открываете его для отправки стандартного вывода в файл - возможно, используя freopen().Когда вы закончите запись в файл, вы захотите снова подключить стандартный вывод к терминалу.

Если это правильно, вам, вероятно, нужно использовать freopen(), чтобы открыть файл /dev/tty.Обратите внимание, что это не совсем надежно;если программа запускается без терминала (например, если она запускается из задания cron), открытие /dev/tty завершится неудачей.

Однако было бы лучше (как в более простом) иметькод, который записывает в файл, принимает аргумент файлового потока, поэтому вам не нужно полагаться на перенаправление и перенаправление стандартного вывода.

Если вы работаете с файловыми дескрипторами, вы можете использовать dup() настандартный дескриптор выходного файла перед выполнением первоначального перенаправления в файл.Затем можно снова использовать dup() для повторного подключения исходного стандартного вывода обратно к исходному дескриптору файла после закрытия перенаправленного стандартного вывода.

1 голос
/ 20 февраля 2011

Ну, вы звучите так, как будто вы описываете смесь выходных данных, некоторые для экрана, а некоторые для файла. Если это так, вам нужно будет получить другой файловый дескриптор и использовать его для записи одного или другого. Файловый дескриптор не может указывать более чем на один пункт назначения.

Если вы хотите, чтобы все выходные данные отображались на экране и в файле, посмотрите на команду tee (1) .

...