Сброс STDOUT и STDERR с помощью /dev/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);
            }

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

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

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

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

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


person user849170    schedule 25.10.2011    source источник
comment
Просто дополнительное примечание: я распечатал ошибку, используя perror. Пишет что "Устройство не настроено".   -  person user849170    schedule 25.10.2011


Ответы (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.
person paxdiablo    schedule 25.10.2011