Perl для системного администрирования




Отслеживание операций с файлами и сетью - часть 3


/p>

Значение АИ из приведенного примера- это всего лишь постоянная, объединяющая все варианты выбора. Если не указать параметр Filter при вызове метода, то по умолчанию будет использоваться АИ. Параметр WatchSubtree определяет, необходимо ли следить только за указанным каталогом или за каталогом и всеми его подкаталогами.

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

$thread->EnableWatch() or die

"Невозможно начать наблюдение\п";

Существует также функция OisableWatch(), которую необходимо использовать в программе для завершения проверки.

Мы следим за нужным объектом, но как узнать, изменилось ли что-нибудь? Надо придумать что-то, что позволило бы потоку сообщить нам об изменениях, за которыми мы наблюдаем. Здесь тот же подход, что и в главе 9 «Журналы» при обсуждении сетевых сокетов. Обычно следует вызывать функции, которые заблокированы до тех пор, пока ничего не происходит:

while($thread->Wait(INFINITE)){

print "Что-то изменилось1\п":

last if ($changes++ == 5):

}

Этот цикл while() вызовет метод Wait() для нашего потока. До тех пор пока потоку нечего сообщить, вызов будет заблокирован. Обычно Wair() принимает в качестве параметра число миллисекунд, равное времени ожидания. Мы же передаем специальное значение, которое соответствует «бесконечному ожиданию». Когда Wait() возвращает значение, следует вывести сообщение и ждать дальше, если только уже не были замечены пять других изменений. Теперь можно закончить:

$thread->Terminnte() undef $aobj;

Наша программа пока еще не очень полезна. Нам известно, что что-то изменилось, но мы не знаем ни что изменилось, ни как это произошло. Чтобы исправить эту ситуацию, изменим тело цикла wniie() и добавим определение формата:

while($thread->Wait(INFINITE)){

while ($thread->Read(\@status)){ foreach Sevent (@status){

Sfilename = $event->{FileName); $time = $event->{DateTime};

Saction = $ActionName{$event->{Action}}; write; } } }




Содержание  Назад  Вперед