# fileevent

Исполняет скрипт, когда канал открывается на чтение или запись.

          fileevent channelId readable ?script?
          fileevent channelId writable ?script?

## ОПИСАНИЕ

Эта команда используется для создания обработчиков файловых событий. Обработчик файловых событий связывает канал и скрипт таким образом, что скрипт исполняется, когда канал открывается на чтение или запись. Обработчики файловых событий используются, чтобы получение данных от другого процесса управлялось событиями. При этом получающий процесс, ожидая поступление данных, сможет продолжать взаимодействовать с пользователем. Если приложение выполняет команду gets или read из блокирующего канала, оно не способно обслуживать другие события, поэтому оно кажется пользователю "замороженным". С использованием файловых событий процесс обратится к команде gets или read только когда информация поступит в канал.

Аргумент channelId должен быть идентификатором открытого канала, который вернула предыдущая команда open или socket. Если в команде присутствует аргумент script, команда создает новый обработчик событий: скрипт script будет выполнен, когда канал channelId откроется на чтение или запись (в зависимости от второго аргумента команды). В такой форме команда возвращает пустую строку. Обработчики для обработки открытия файла на чтение или запись соответственно независимы и могут создаваться и удаляться по одному, независимо один от другого. Однако для каждого из событий может быть только один обработчик, так что если команда fileevent выполняется, когда соответствующий обработчик (в текущем интерпретаторе) уже задан, новый скрипт заменит старый.

Если аргумент script не задан, команда fileevent возвратит скрипт, заданный для данного события для канала channelId, или пустую строку, если скрипт не задан. Обработчик событий удаляется автоматически при закрытии канала или удалении интерпретатора.

Канал считается открытым на чтение, если на соответствующем устройстве есть непрочитанные данные. Также канал считается открытым на чтение, если есть непрочитанные данные во входном буфере, кроме того случая, когда команда gets не смогла найти в буфере законченную строку. Эта особенность позволяет читать файл построчно в неблокирующем режиме, используя обработчик событий. Канал также считается открытым на чтение, если достигнут конец соответствующего файла или на соответствующем устройстве сгенерирована ошибка. Поэтому скрипт должен уметь распознавать и корректно обрабатывать такие ситуации, чтобы не возникало зацикливаний, когда скрипт не может прочитать данные, завершается и тут же вызывается вновь.

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

Событийно управляемый ввод - вывод лучше всего работает с каналами, переведенными в неблокирующий режим с помощью команды fconfigure. В блокирующем режиме команды puts, gets или read могут заблокировать процесс, если они не могут быть выполнены сразу (например, при попытке прочитать больше данных, чем доступно в настоящий момент). При этом никакой обработки событий не происходит. В неблокирующем режиме команды puts, gets или read никогда не блокируют процесс. Детальное описание работы команд с блокирующими и неблокирующими каналами приведено в описаниях соответствующих команд.

Скрипт обработчика файловых событий выполняется на самом верхнем уровне вне контекста какой-либо процедуры в интерпретаторе, в котором обработчик событий был задан. Если при исполнении скрипта происходит ошибка, сообщение о ней выдается с помощью процедуры bgerror. Кроме того, при ошибке соответствующий обработчик событий удаляется. Это делается для того, чтобы избежать зацикливания из-за ошибок в обработчике.