Тези дни прекарах няколко часа в мислене на решение за един доста неприятен UNIX проблем. Имам един daemon процес, в който работят няколко нишки. Едната нишка спи и чака получаване на информация по socket с помощта на select.
Исках този процес, при получаване на сигнал SIGHUP да си прочете отново конфигурационния файл. Инсталирах си signal handler, както си трябва. Но се оказа, че при получаване на какъвто и да било сигнал, нишката която чака на select спира да чака, а select връща -1. Като помислих малко, стигнах до извода, че това е напълно нормално. select си инсталира някакъв signal handler и когато някакъв сигнал се получи от процеса, този handler се изпълнява будейки процеса. И тъй като сигналите си нямат никакво понятие за нишките в един процес, се получава наблюдавания ефект. Не можах да измисля някакво разумно решение на този проблем, което да ми харесва. Едно възможно решение е да държа конфигурационния файл отворен, и по някакъв начин си организирам достъп до него през select. Тази идея не е много добра, защото използвам библиотека, която си чете този файл. А и работата с него няма нищо общо с нишката, която прави select. Сетих се, че съм виждал програми, от сорта на privoxy, на които не им трябва рестартиране (както и пращане на сигнали) при промяна на конфигурацията. Винаги ми е било интересно как са организирани и ето, че днес ми падна възможност да проверя. Не беше нищо особено и необичайно, беше точно по начина по който си мислех. При пускане на програмата си записват времето на промяна на файла в структурата с конфигурацията. След което, през определено време правят stat,
и ако има промяна във времето на модификация на файла, го прочитат отново. Цялата тази работа е доста user-friendly. Privoxy позволява да си променяш настройките директно през броузера, това нямаше да има никакъв смисъл, ако конфигурацията не се презареждаше без рестарт (или някакво действие от страна на потребителя). Не съм голям привърженик на непрекъснатото правене на poll към файловата система, но в случая нямам голям избор. Все пак, след като го написах се оказа, че системата не се натоварва чак толкова. Особено след като човек избере подходящо време за nanosleep.
В момента ми харесва как работи. По-добро решение би било да използвам някакъв File Alternation Monitor. Проблемът с тях е, че са ориентирани по-скоро към настолните компютри и графичните среди. На мен ми трябва за сървър, а и използването на FAM би имало смисъл, ако повече неща разчитаха на него. Пускането му за ползване, само от един процес би било хабене на много памет за сметка на малко спестено процесорно време.