От 15 февраля 2015 г., 19:40:12 в fido7.ru.linux.chainik ты писал: SL>>>>> По POSIX тот же localtime() безусловно вызывает tzset(). SL>>>>> Фактически же оно в glibc работает иначе, не так, как описано в SL>>>>> документации и это ошибка. ??>>>> Предлагаешь всякий ??>>>> раз заглядывать в /etc/localtime? VD>>> А в чём проблема, собственно, заглянуть? Файлец маленький, в VD>>> одну страницу помещается. ??>> Каждый раз считывать - лишний системный вызов. VD> Так оно ж всё равно вызывается не просто так, а ради того, VD> чтобы лог записать, хедер отослать или ещё какую штуку сдеалть, VD> которая и сама по себе системные вызовы требует, причём, в VD> отличие от считывания 1 страницы из кэша, занимает дорогие VD> ресурсы вроде диска или сети.
Это немного дороже, чем 1 страница. В типичном случае, это open() на символическую ссылку "/etc/localtime" и read() небольшого объёма. В прочем, при наличии localtime_r() такая реализация тоже была бы приемлема.
??>> Однако, т.к. glibc уже давно библиотека практически одной ??>> системы GNU/Linux, то есть же в GNU/Linux эффективные ??>> средства мониторинга изменений файлов. VD> Это да. В других системах особенности поведения localtime() VD> чётко описаны в документации, например; VD> The function localtime() uses tzset(3) to initialize time VD> conversion information if tzset(3) has not already been called VD> by the process.
Hу потребители более строгие, так что немного честнее, а так, те же грабли, только в профиль. Это получается уже почти localtime_r(). И каждый производитель программы или демона должен выбирать между: - забить и удовлетворится однократным считыванием; - звать tzset() на сигнал HUP (/etc/rc.d/XXXX reload); - каждый раз звать tzset(); - делать это по расписанию (типа в 02:01) или по таймауту, например, раз в 10^6 - 10^9 тактов процессора; - самостоятельно мониторить изменения (технически возможно, ибо устройство tzset() документировано, но это всё же его потороха и программам негоже зависеть от них).
??>> Как вариант, периодическое считывание по расписанию. VD> Авторы демонов этой возможностью почему-то неохотно VD> пользуются...
Возможно они думают, что когда нибудь эту ошибку реализации localtime() в glibc исправят. Хотя, по хорошему, могли бы перейти на честный localtime_r().
-- Успехов, Сергей Леонтьев. E-mail: lse@CryptoPro.ru
>> --- ifmail v.2.15dev5.4 * Origin: ГАИШ МГУ (2:5020/400)