|
|
In non-canonical input processing, input bytes are not assembled into lines, and erase and kill processing does not occur. The values of the MIN and TIME members of the c_cc array determine how to process any data received.
MIN is the minimum number of bytes of data that a read should return when it completes successfully. If MIN exceeds MAX_INPUT, the response to the request is implementation-defined. In UNIX System V, the maximum value that can be stored for MIN in c_cc[VMIN] is 256, less than MAX_INPUT which equals 512; thus, the MIN value can never exceed MAX_INPUT. TIME is a read-timer with a 0.10 second granularity used to time-out bursty and short-term data transmissions. The four possible interactions between MIN and TIME follow:
Because TIME>0, it serves as an inter-byte timer activated on receipt of the first byte of data, and reset on receipt of each byte of data. MIN and TIME interact as follows:
Because TIME=0, the timer plays no role and only MIN is significant.
A read completes successfully only on receiving MIN bytes of data (i.e., the pending read blocks until MIN bytes of data are received) or a signal interrupts the read.
Use these values only when the program cannot continue until a predetermined number of bytes of data are read.
A program using this case to do record-based terminal I/O may block indefinitely in a read.
Because MIN=0, TIME no longer serves as an inter-byte timer, but now serves as a read-timer activated when a read is processed (in canon). A read completes successfully as soon as any bytes of data are received or the read-timer expires. A read does not transfer any bytes of data if the read-timer expires. If the read-timer does not expire, a read completes successfully if and only if some bytes of data are received. In case (MIN=0, TIME>0), the read does not block indefinitely waiting for a byte of data. If no bytes of data are received within TIME*0.10 seconds after the read starts, it returns 0 having read no data. If the buffer holds data when a read starts, the read-timer starts as if it received data immediately. MIN and TIME are useful when a program can assume that data is not available after a TIME interval and other processing can be done before data is available.
Without waiting for more bytes of data to be received, a read returns the minimum of either the number of bytes of data requested or the number of bytes of data currently available. In this case, a read immediately transfers any bytes of data present, or if no bytes of data are available, it returns 0 having read no data. In case (MIN=0, TIME=0), read operates identically to the O_NDELAY flag in canonical mode.
MIN/TIME interactions serve different purposes and thus do not parallel one another. In case [2]: (MIN>0, TIME=0), TIME lacks effect, but with the conditions reversed in case [3]: (MIN=0, TIME>0), both MIN and TIME play a role in that receiving a single byte satisfies the MIN criteria. Furthermore, in case [3]: (MIN=0, TIME>0), TIME represents a read-timer, while in case [1]: (MIN>0, TIME>0), TIME represents an inter-byte timer,
Cases [1] and [2], where MIN>0, handle burst mode activity (e.g., file-transfers), where programs need to process at least MIN bytes of data at a time. In case [1], the inter-byte timer acts as a safety measure; in case [2], the timer is turned off.
Cases [3] and [4] handle single byte, timed transfers like those used by screen-based programs that need to know if a byte of data is present in the input-queue before refreshing the screen. In case [3], the read is timed, while in case [4], it is not.
One should also note that MIN is always just a minimum, and does not define a record length. Thus, if a program tries a read of 20 bytes when 25 bytes of data are present and MIN is 10, the read returns 20 bytes of data. In the special case of MIN=0, this still applies: if more than one byte of data is available, all data is returned immediately.