108 lines
5.3 KiB
HTML
108 lines
5.3 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||
<html>
|
||
<head>
|
||
<title>fileevent</title>
|
||
</head>
|
||
<body>
|
||
<h1>fileevent</h1>
|
||
|
||
<p> Исполняет скрипт, когда канал открывается на чтение или
|
||
запись. </p>
|
||
|
||
<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>
|
||
|
||
<h2>ОПИСАНИЕ</h2>
|
||
|
||
<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> только когда информация
|
||
поступит в канал.
|
||
</p>
|
||
|
||
<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> выполняется, когда соответствующий
|
||
обработчик (в текущем интерпретаторе) уже задан, новый скрипт
|
||
заменит старый.
|
||
</p>
|
||
|
||
<p> Если аргумент <em>script</em> не задан, команда <strong>fileevent</strong>
|
||
возвратит скрипт, заданный для данного события для канала
|
||
<em>channelId</em>, или пустую строку, если скрипт не
|
||
задан. Обработчик событий удаляется автоматически при закрытии
|
||
канала или удалении интерпретатора.
|
||
</p>
|
||
<p> Канал считается открытым на чтение, если на соответствующем
|
||
устройстве есть непрочитанные данные. Также канал считается
|
||
открытым на чтение, если есть непрочитанные данные во входном
|
||
буфере, кроме того случая, когда команда <a
|
||
href="gets.htm"><strong>gets</strong></a> не смогла найти в буфере
|
||
законченную строку. Эта особенность позволяет читать файл
|
||
построчно в неблокирующем режиме, используя обработчик
|
||
событий. Канал также считается открытым на чтение, если
|
||
достигнут конец соответствующего файла или на соответствующем
|
||
устройстве сгенерирована ошибка. Поэтому скрипт должен уметь
|
||
распознавать и корректно обрабатывать такие ситуации, чтобы не
|
||
возникало зацикливаний, когда скрипт не может прочитать данные,
|
||
завершается и тут же вызывается вновь.
|
||
</p>
|
||
<p> Канал считается открытым на запись, если по крайней мере один
|
||
байт данных может быть записан в соответствующий файл или
|
||
передан на соответствующее устройство, или на устройстве (в
|
||
файле) сгенерирована ошибка.
|
||
</p>
|
||
<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> никогда не блокируют
|
||
процесс. Детальное описание работы команд с блокирующими и
|
||
неблокирующими каналами приведено в описаниях соответствующих
|
||
команд.
|
||
</p>
|
||
<p> Скрипт обработчика файловых событий выполняется на самом
|
||
верхнем уровне вне контекста какой-либо процедуры в
|
||
интерпретаторе, в котором обработчик событий был задан. Если при
|
||
исполнении скрипта происходит ошибка, сообщение о ней выдается с
|
||
помощью процедуры <a href=
|
||
"bgerror.html"><strong>bgerror</strong></a>. Кроме того, при ошибке
|
||
соответствующий обработчик событий удаляется. Это делается для
|
||
того, чтобы избежать зацикливания из-за ошибок в обработчике.
|
||
</p>
|
||
</body>
|
||
</html>
|