2018-02-05 17:22:04 +03:00
|
|
|
|
<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
<title>fileevent</title>
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
<h1>fileevent</h1>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p> Исполняет скрипт, когда канал открывается на чтение или
|
|
|
|
|
запись. </p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
<strong>fileevent</strong> <em>channelId</em> <strong>readable</strong> ?<em>script</em>?
|
|
|
|
|
<strong>fileevent</strong> <em>channelId</em> <strong>writable</strong> ?<em>script</em>?
|
|
|
|
|
</pre>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2>ОПИСАНИЕ</h2>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p> Эта команда используется для создания обработчиков файловых
|
|
|
|
|
событий. Обработчик файловых событий связывает канал и скрипт
|
|
|
|
|
таким образом, что скрипт исполняется, когда канал открывается
|
|
|
|
|
на чтение или запись. Обработчики файловых событий используются,
|
|
|
|
|
чтобы получение данных от другого процесса управлялось
|
|
|
|
|
событиями. При этом получающий процесс, ожидая поступление
|
|
|
|
|
данных, сможет продолжать взаимодействовать с
|
|
|
|
|
пользователем. Если приложение выполняет команду <a
|
|
|
|
|
href=gets.html>gets</a> или <a
|
|
|
|
|
href=read.html><strong>read</strong></a> из блокирующего канала, оно
|
|
|
|
|
не способно обслуживать другие события, поэтому оно кажется
|
|
|
|
|
пользователю "замороженным". С использованием файловых
|
|
|
|
|
событий процесс обратится к команде <a
|
|
|
|
|
href=gets.htm><strong>gets</strong></a> или <a
|
|
|
|
|
href=read.html><strong>read</strong></a> только когда информация
|
|
|
|
|
поступит в канал.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p> Аргумент <em>channelId</em> должен быть идентификатором
|
|
|
|
|
открытого канала, который вернула предыдущая команда <a
|
|
|
|
|
href=open.html><strong>open</strong></a> или <a href=
|
|
|
|
|
socket.html><strong>socket</strong></a>. Если в команде присутствует
|
|
|
|
|
аргумент <em>script</em>, команда создает новый обработчик
|
|
|
|
|
событий: скрипт <em>script</em> будет выполнен, когда канал
|
|
|
|
|
<em>channelId</em> откроется на чтение или запись (в зависимости
|
|
|
|
|
от второго аргумента команды). В такой форме команда возвращает
|
|
|
|
|
пустую строку. Обработчики для обработки открытия файла на
|
|
|
|
|
чтение или запись соответственно независимы и могут создаваться
|
|
|
|
|
и удаляться по одному, независимо один от другого. Однако для
|
|
|
|
|
каждого из событий может быть только один обработчик, так что
|
|
|
|
|
если команда <strong>fileevent</strong> выполняется, когда соответствующий
|
|
|
|
|
обработчик (в текущем интерпретаторе) уже задан, новый скрипт
|
|
|
|
|
заменит старый.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p> Если аргумент <em>script</em> не задан, команда <strong>fileevent</strong>
|
|
|
|
|
возвратит скрипт, заданный для данного события для канала
|
|
|
|
|
<em>channelId</em>, или пустую строку, если скрипт не
|
|
|
|
|
задан. Обработчик событий удаляется автоматически при закрытии
|
|
|
|
|
канала или удалении интерпретатора.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</p>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p> Канал считается открытым на чтение, если на соответствующем
|
|
|
|
|
устройстве есть непрочитанные данные. Также канал считается
|
|
|
|
|
открытым на чтение, если есть непрочитанные данные во входном
|
|
|
|
|
буфере, кроме того случая, когда команда <a
|
|
|
|
|
href=gets.htm><strong>gets</strong></a> не смогла найти в буфере
|
|
|
|
|
законченную строку. Эта особенность позволяет читать файл
|
|
|
|
|
построчно в неблокирующем режиме, используя обработчик
|
|
|
|
|
событий. Канал также считается открытым на чтение, если
|
|
|
|
|
достигнут конец соответствующего файла или на соответствующем
|
|
|
|
|
устройстве сгенерирована ошибка. Поэтому скрипт должен уметь
|
|
|
|
|
распознавать и корректно обрабатывать такие ситуации, чтобы не
|
|
|
|
|
возникало зацикливаний, когда скрипт не может прочитать данные,
|
|
|
|
|
завершается и тут же вызывается вновь.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</p>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p> Канал считается открытым на запись, если по крайней мере один
|
|
|
|
|
байт данных может быть записан в соответствующий файл или
|
|
|
|
|
передан на соответствующее устройство, или на устройстве (в
|
|
|
|
|
файле) сгенерирована ошибка.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</p>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p> Событийно управляемый ввод - вывод лучше всего работает с
|
|
|
|
|
каналами, переведенными в неблокирующий режим с помощью команды
|
|
|
|
|
<a href=fconfigure.html><strong>fconfigure</strong></a>. В
|
|
|
|
|
блокирующем режиме команды <a
|
|
|
|
|
href=puts.html><strong>puts</strong></a>, <a
|
|
|
|
|
href=gets.html><strong>gets</strong></a> или <a
|
|
|
|
|
href=read.html><strong>read</strong></a> могут заблокировать
|
|
|
|
|
процесс, если они не могут быть выполнены сразу (например, при
|
|
|
|
|
попытке прочитать больше данных, чем доступно в настоящий
|
|
|
|
|
момент). При этом никакой обработки событий не происходит. В
|
|
|
|
|
неблокирующем режиме команды <a href=
|
|
|
|
|
puts.html><strong>puts</strong></a>, <a href=
|
|
|
|
|
gets.html><strong>gets</strong></a> или <a
|
|
|
|
|
href=read.html><strong>read</strong></a> никогда не блокируют
|
|
|
|
|
процесс. Детальное описание работы команд с блокирующими и
|
|
|
|
|
неблокирующими каналами приведено в описаниях соответствующих
|
|
|
|
|
команд.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</p>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p> Скрипт обработчика файловых событий выполняется на самом
|
|
|
|
|
верхнем уровне вне контекста какой-либо процедуры в
|
|
|
|
|
интерпретаторе, в котором обработчик событий был задан. Если при
|
|
|
|
|
исполнении скрипта происходит ошибка, сообщение о ней выдается с
|
|
|
|
|
помощью процедуры <a href=
|
|
|
|
|
bgerror.html><strong>bgerror</strong></a>. Кроме того, при ошибке
|
|
|
|
|
соответствующий обработчик событий удаляется. Это делается для
|
|
|
|
|
того, чтобы избежать зацикливания из-за ошибок в обработчике.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</p>
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
|