fileevent.n
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
- '"
- '" Copyright (c) 1994 The Regents of the University of California.
- '" Copyright (c) 1994-1996 Sun Microsystems, Inc.
- '"
- '" See the file "license.terms" for information on usage and redistribution
- '" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- '"
- '" RCS: @(#) $Id: fileevent.n,v 1.5.6.1 2004/10/27 12:52:40 dkf Exp $
- '"
- .so man.macros
- .TH fileevent n 7.5 Tcl "Tcl Built-In Commands"
- .BS
- '" Note: do not modify the .SH NAME line immediately below!
- .SH NAME
- fileevent - Execute a script when a channel becomes readable or writable
- .SH SYNOPSIS
- fBfileevent fIchannelId fBreadable fR?fIscriptfR?
- .sp
- fBfileevent fIchannelId fBwritable fR?fIscriptfR?
- .BE
- .SH DESCRIPTION
- .PP
- This command is used to create fIfile event handlersfR. A file event
- handler is a binding between a channel and a script, such that the script
- is evaluated whenever the channel becomes readable or writable. File event
- handlers are most commonly used to allow data to be received from another
- process on an event-driven basis, so that the receiver can continue to
- interact with the user while waiting for the data to arrive. If an
- application invokes fBgetsfR or fBreadfR on a blocking channel when
- there is no input data available, the process will block; until the input
- data arrives, it will not be able to service other events, so it will
- appear to the user to ``freeze up''. With fBfileeventfR, the process can
- tell when data is present and only invoke fBgetsfR or fBreadfR when
- they won't block.
- .PP
- .VS
- The fIchannelIdfR argument to fBfileeventfR refers to an open
- channel such as a Tcl standard channel (fBstdinfR, fBstdoutfR,
- or fBstderrfR), the return value from an invocation of fBopenfR
- or fBsocketfR, or the result of a channel creation command provided
- by a Tcl extension.
- .VE
- .PP
- If the fIscriptfR argument is specified, then fBfileeventfR
- creates a new event handler: fIscriptfR will be evaluated
- whenever the channel becomes readable or writable (depending on the
- second argument to fBfileeventfR).
- In this case fBfileeventfR returns an empty string.
- The fBreadablefR and fBwritablefR event handlers for a file
- are independent, and may be created and deleted separately.
- However, there may be at most one fBreadablefR and one fBwritablefR
- handler for a file at a given time in a given interpreter.
- If fBfileeventfR is called when the specified handler already
- exists in the invoking interpreter, the new script replaces the old one.
- .PP
- If the fIscriptfR argument is not specified, fBfileeventfR
- returns the current script for fIchannelIdfR, or an empty string
- if there is none.
- If the fIscriptfR argument is specified as an empty string
- then the event handler is deleted, so that no script will be invoked.
- A file event handler is also deleted automatically whenever
- its channel is closed or its interpreter is deleted.
- .PP
- A channel is considered to be readable if there is unread data
- available on the underlying device.
- A channel is also considered to be readable if there is unread
- data in an input buffer, except in the special case where the
- most recent attempt to read from the channel was a fBgetsfR
- call that could not find a complete line in the input buffer.
- This feature allows a file to be read a line at a time in nonblocking mode
- using events.
- A channel is also considered to be readable if an end of file or
- error condition is present on the underlying file or device.
- It is important for fIscriptfR to check for these conditions
- and handle them appropriately; for example, if there is no special
- check for end of file, an infinite loop may occur where fIscriptfR
- reads no data, returns, and is immediately invoked again.
- .PP
- A channel is considered to be writable if at least one byte of data
- can be written to the underlying file or device without blocking,
- or if an error condition is present on the underlying file or device.
- .PP
- Event-driven I/O works best for channels that have been
- placed into nonblocking mode with the fBfconfigurefR command.
- In blocking mode, a fBputsfR command may block if you give it
- more data than the underlying file or device can accept, and a
- fBgetsfR or fBreadfR command will block if you attempt to read
- more data than is ready; no events will be processed while the
- commands block.
- In nonblocking mode fBputsfR, fBreadfR, and fBgetsfR never block.
- See the documentation for the individual commands for information
- on how they handle blocking and nonblocking channels.
- .PP
- The script for a file event is executed at global level (outside the
- context of any Tcl procedure) in the interpreter in which the
- fBfileeventfR command was invoked.
- If an error occurs while executing the script then the
- fBbgerrorfR mechanism is used to report the error.
- In addition, the file event handler is deleted if it ever returns
- an error; this is done in order to prevent infinite loops due to
- buggy handlers.
- .SH EXAMPLE
- In this setup fBGetDatafR will be called with the channel as an
- argument whenever $chan becomes readable.
- .CS
- proc GetData {chan} {
- if {![eof $chan]} {
- puts [gets $chan]
- }
- }
- fBfileeventfR $chan readable [list GetData $chan]
- .CE
- .SH CREDITS
- .PP
- fBfileeventfR is based on the fBaddinputfR command created
- by Mark Diekhans.
- .SH "SEE ALSO"
- bgerror(n), fconfigure(n), gets(n), puts(n), read(n), Tcl_StandardChannels(3)
- .SH KEYWORDS
- asynchronous I/O, blocking, channel, event handler, nonblocking, readable,
- script, writable.