Повторное открытие стандартного файлового дескриптора

Ранее мы уже упоминали о том, что при повторном открытии файлового дескриптора (то есть если вы открываете файловый дескриптор FRED, хотя в программе уже имеется открытый файловый дескриптор FRED) старый дескриптор закрывается автоматически. И мы сказали, что использовать имена шести стандартных файловых дескрипторов нежелательно, если только вы не собираетесь наделить их специальными возможностями. Также мы говорили, что сообщения die и warn вместе с внутренними сообщениями Perl автоматически направляются в STDERR. Если объединить все сказанное, становится ясно, как направить сообщения об ошибках в файл вместо стандартного потока ошибок вашей программы:

# Отправлять ошибки в личный журнал
if ( ! open STDERR, ">>/home/barney/.error_log") {
die "Can't open error log for append: $!";
}

После повторного открытия STDERR все сообщения об ошибках, поступающие от Perl, заносятся в новый файл. Но что произойдет при выполнении die – куда попадет это сообщение, если новый файл не удалось открыть для приема сообщений? Если при повторном открытии одного из трех системных файловых дескрипторов – STDIN, STDOUT или STDERR – произойдет ошибка, Perl любезно восстанавливает исходное значение. То есть Perl закрывает исходный дескриптор (любой из этих трех) только тогда, когда он видит, что открытие нового канала прошло успешно. Таким образом, этот прием может использоваться для перенаправления любых из трех системных файловых дескрипторов внутри вашей программы – почти так же, как если бы программа изначально была запущена в командном процессоре с перенаправлением ввода/вывода.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Аргументы вызова
Ввод данных оператором <>
Вывод функцией say
Закрытие файлового дескриптора
Запись данных в стандартный вывод

Вернуться в раздел: Perl / 4. Ввод и вывод