Сброс стандартного вывода и STDERR с помощью /dev/tty

#stdout #stderr #tty

#стандартный вывод #stderr #tty

Вопрос:

Я пытаюсь перенаправить stdout и stderr в файл, а затем восстановить их исходные настройки. Я успешно перенаправил выходные данные в файл, но, похоже, не могу восстановить их из tty. Это код, который у меня есть:

             fid = open("/dev/tty", O_WRONLY);
            if (fid < 0) {
                fprintf(stderr, "Opening TTY failed.");
                exit(1);
            } else {
                close(1);
                dup(fid);

                close(fid);
            }
 

вызов open на tty всегда завершается с ошибкой. (возвращает -1). Есть ли что-то фундаментально неправильное, что я пытаюсь сделать?

Я также подумал, что, возможно, это может быть проблема с разрешениями, поэтому я проверил их:

crw-rw-rw- 1 корневое колесо 2, 0 21 октября 10:46 / dev/tty

Я разрабатываю Snow Leopard, чего бы это ни стоило,

Заранее спасибо за любую помощь.

Комментарии:

1. Просто дополнительное примечание: я распечатал ошибку с помощью perror . Он говорит, что «Устройство не настроено».

Ответ №1:

Я бы просто сохранил предыдущие настройки с dup помощью вызова, а затем использовал dup2 , когда вы захотите их восстановить. Это особенно верно, поскольку «исходные настройки», к которым вы хотите их вернуть, могут вообще не относиться к терминальному устройству (это неразумное предположение с вашей стороны) — пользователь, возможно, уже использовал перенаправление за пределами вашей сферы влияния.

Таким образом, вам вообще не нужно беспокоиться о их повторном открытии, включая вероятность того, что вы можете неправильно ввести аргументы или выполнить какие-либо специальные настройки (например, с ioctl помощью ).

Что-то вроде:

 int saveFd = dup (1);        // check for errors.

blahBlahBlah();              // close file desc 1, reopen,
                             //   and weave your magic.

int rc = dup2 (1, saveFd);   // check for errors.