mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-30 10:45:40 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			2069 lines
		
	
	
		
			73 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			2069 lines
		
	
	
		
			73 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| @node Low-Level Terminal Interface, Mathematics, Sockets, Top
 | |
| @c %MENU% How to change the characteristics of a terminal device
 | |
| @chapter Low-Level Terminal Interface
 | |
| 
 | |
| This chapter describes functions that are specific to terminal devices.
 | |
| You can use these functions to do things like turn off input echoing;
 | |
| set serial line characteristics such as line speed and flow control; and
 | |
| change which characters are used for end-of-file, command-line editing,
 | |
| sending signals, and similar control functions.
 | |
| 
 | |
| Most of the functions in this chapter operate on file descriptors.
 | |
| @xref{Low-Level I/O}, for more information about what a file
 | |
| descriptor is and how to open a file descriptor for a terminal device.
 | |
| 
 | |
| @menu
 | |
| * Is It a Terminal::            How to determine if a file is a terminal
 | |
| 			         device, and what its name is.
 | |
| * I/O Queues::                  About flow control and typeahead.
 | |
| * Canonical or Not::            Two basic styles of input processing.
 | |
| * Terminal Modes::              How to examine and modify flags controlling
 | |
| 			         details of terminal I/O: echoing,
 | |
|                                  signals, editing.
 | |
| * Line Control::                Sending break sequences, clearing
 | |
|                                  terminal buffers @dots{}
 | |
| * Noncanon Example::            How to read single characters without echo.
 | |
| * Pseudo-Terminals::            How to open a pseudo-terminal.
 | |
| @end menu
 | |
| 
 | |
| @node Is It a Terminal
 | |
| @section Identifying Terminals
 | |
| @cindex terminal identification
 | |
| @cindex identifying terminals
 | |
| 
 | |
| The functions described in this chapter only work on files that
 | |
| correspond to terminal devices.  You can find out whether a file
 | |
| descriptor is associated with a terminal by using the @code{isatty}
 | |
| function.
 | |
| 
 | |
| @pindex unistd.h
 | |
| Prototypes for the functions in this section are declared in the header
 | |
| file @file{unistd.h}.
 | |
| 
 | |
| @comment unistd.h
 | |
| @comment POSIX.1
 | |
| @deftypefun int isatty (int @var{filedes})
 | |
| This function returns @code{1} if @var{filedes} is a file descriptor
 | |
| associated with an open terminal device, and @math{0} otherwise.
 | |
| @end deftypefun
 | |
| 
 | |
| If a file descriptor is associated with a terminal, you can get its
 | |
| associated file name using the @code{ttyname} function.  See also the
 | |
| @code{ctermid} function, described in @ref{Identifying the Terminal}.
 | |
| 
 | |
| @comment unistd.h
 | |
| @comment POSIX.1
 | |
| @deftypefun {char *} ttyname (int @var{filedes})
 | |
| If the file descriptor @var{filedes} is associated with a terminal
 | |
| device, the @code{ttyname} function returns a pointer to a
 | |
| statically-allocated, null-terminated string containing the file name of
 | |
| the terminal file.  The value is a null pointer if the file descriptor
 | |
| isn't associated with a terminal, or the file name cannot be determined.
 | |
| @end deftypefun
 | |
| 
 | |
| @comment unistd.h
 | |
| @comment POSIX.1
 | |
| @deftypefun int ttyname_r (int @var{filedes}, char *@var{buf}, size_t @var{len})
 | |
| The @code{ttyname_r} function is similar to the @code{ttyname} function
 | |
| except that it places its result into the user-specified buffer starting
 | |
| at @var{buf} with length @var{len}.
 | |
| 
 | |
| The normal return value from @code{ttyname_r} is @math{0}.  Otherwise an
 | |
| error number is returned to indicate the error.  The following
 | |
| @code{errno} error conditions are defined for this function:
 | |
| 
 | |
| @table @code
 | |
| @item EBADF
 | |
| The @var{filedes} argument is not a valid file descriptor.
 | |
| 
 | |
| @item ENOTTY
 | |
| The @var{filedes} is not associated with a terminal.
 | |
| 
 | |
| @item ERANGE
 | |
| The buffer length @var{len} is too small to store the string to be
 | |
| returned.
 | |
| @end table
 | |
| @end deftypefun
 | |
| 
 | |
| @node I/O Queues
 | |
| @section I/O Queues
 | |
| 
 | |
| Many of the remaining functions in this section refer to the input and
 | |
| output queues of a terminal device.  These queues implement a form of
 | |
| buffering @emph{within the kernel} independent of the buffering
 | |
| implemented by I/O streams (@pxref{I/O on Streams}).
 | |
| 
 | |
| @cindex terminal input queue
 | |
| @cindex typeahead buffer
 | |
| The @dfn{terminal input queue} is also sometimes referred to as its
 | |
| @dfn{typeahead buffer}.  It holds the characters that have been received
 | |
| from the terminal but not yet read by any process.
 | |
| 
 | |
| The size of the input queue is described by the @code{MAX_INPUT} and
 | |
| @w{@code{_POSIX_MAX_INPUT}} parameters; see @ref{Limits for Files}.  You
 | |
| are guaranteed a queue size of at least @code{MAX_INPUT}, but the queue
 | |
| might be larger, and might even dynamically change size.  If input flow
 | |
| control is enabled by setting the @code{IXOFF} input mode bit
 | |
| (@pxref{Input Modes}), the terminal driver transmits STOP and START
 | |
| characters to the terminal when necessary to prevent the queue from
 | |
| overflowing.  Otherwise, input may be lost if it comes in too fast from
 | |
| the terminal.  In canonical mode, all input stays in the queue until a
 | |
| newline character is received, so the terminal input queue can fill up
 | |
| when you type a very long line.  @xref{Canonical or Not}.
 | |
| 
 | |
| @cindex terminal output queue
 | |
| The @dfn{terminal output queue} is like the input queue, but for output;
 | |
| it contains characters that have been written by processes, but not yet
 | |
| transmitted to the terminal.  If output flow control is enabled by
 | |
| setting the @code{IXON} input mode bit (@pxref{Input Modes}), the
 | |
| terminal driver obeys START and STOP characters sent by the terminal to
 | |
| stop and restart transmission of output.
 | |
| 
 | |
| @dfn{Clearing} the terminal input queue means discarding any characters
 | |
| that have been received but not yet read.  Similarly, clearing the
 | |
| terminal output queue means discarding any characters that have been
 | |
| written but not yet transmitted.
 | |
| 
 | |
| @node Canonical or Not
 | |
| @section Two Styles of Input: Canonical or Not
 | |
| 
 | |
| POSIX systems support two basic modes of input: canonical and
 | |
| noncanonical.
 | |
| 
 | |
| @cindex canonical input processing
 | |
| In @dfn{canonical input processing} mode, terminal input is processed in
 | |
| lines terminated by newline (@code{'\n'}), EOF, or EOL characters.  No
 | |
| input can be read until an entire line has been typed by the user, and
 | |
| the @code{read} function (@pxref{I/O Primitives}) returns at most a
 | |
| single line of input, no matter how many bytes are requested.
 | |
| 
 | |
| In canonical input mode, the operating system provides input editing
 | |
| facilities: some characters are interpreted specially to perform editing
 | |
| operations within the current line of text, such as ERASE and KILL.
 | |
| @xref{Editing Characters}.
 | |
| 
 | |
| The constants @code{_POSIX_MAX_CANON} and @code{MAX_CANON} parameterize
 | |
| the maximum number of bytes which may appear in a single line of
 | |
| canonical input.  @xref{Limits for Files}.  You are guaranteed a maximum
 | |
| line length of at least @code{MAX_CANON} bytes, but the maximum might be
 | |
| larger, and might even dynamically change size.
 | |
| 
 | |
| @cindex noncanonical input processing
 | |
| In @dfn{noncanonical input processing} mode, characters are not grouped
 | |
| into lines, and ERASE and KILL processing is not performed.  The
 | |
| granularity with which bytes are read in noncanonical input mode is
 | |
| controlled by the MIN and TIME settings.  @xref{Noncanonical Input}.
 | |
| 
 | |
| Most programs use canonical input mode, because this gives the user a
 | |
| way to edit input line by line.  The usual reason to use noncanonical
 | |
| mode is when the program accepts single-character commands or provides
 | |
| its own editing facilities.
 | |
| 
 | |
| The choice of canonical or noncanonical input is controlled by the
 | |
| @code{ICANON} flag in the @code{c_lflag} member of @code{struct termios}.
 | |
| @xref{Local Modes}.
 | |
| 
 | |
| @node Terminal Modes
 | |
| @section Terminal Modes
 | |
| 
 | |
| @pindex termios.h
 | |
| This section describes the various terminal attributes that control how
 | |
| input and output are done.  The functions, data structures, and symbolic
 | |
| constants are all declared in the header file @file{termios.h}.
 | |
| @c !!! should mention terminal attributes are distinct from file attributes
 | |
| 
 | |
| @menu
 | |
| * Mode Data Types::             The data type @code{struct termios} and
 | |
|                                  related types.
 | |
| * Mode Functions::              Functions to read and set the terminal
 | |
|                                  attributes.
 | |
| * Setting Modes::               The right way to set terminal attributes
 | |
|                                  reliably.
 | |
| * Input Modes::                 Flags controlling low-level input handling.
 | |
| * Output Modes::                Flags controlling low-level output handling.
 | |
| * Control Modes::               Flags controlling serial port behavior.
 | |
| * Local Modes::                 Flags controlling high-level input handling.
 | |
| * Line Speed::                  How to read and set the terminal line speed.
 | |
| * Special Characters::          Characters that have special effects,
 | |
| 			         and how to change them.
 | |
| * Noncanonical Input::          Controlling how long to wait for input.
 | |
| @end menu
 | |
| 
 | |
| @node Mode Data Types
 | |
| @subsection Terminal Mode Data Types
 | |
| @cindex terminal mode data types
 | |
| 
 | |
| The entire collection of attributes of a terminal is stored in a
 | |
| structure of type @code{struct termios}.  This structure is used
 | |
| with the functions @code{tcgetattr} and @code{tcsetattr} to read
 | |
| and set the attributes.
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftp {Data Type} {struct termios}
 | |
| Structure that records all the I/O attributes of a terminal.  The
 | |
| structure includes at least the following members:
 | |
| 
 | |
| @table @code
 | |
| @item tcflag_t c_iflag
 | |
| A bit mask specifying flags for input modes; see @ref{Input Modes}.
 | |
| 
 | |
| @item tcflag_t c_oflag
 | |
| A bit mask specifying flags for output modes; see @ref{Output Modes}.
 | |
| 
 | |
| @item tcflag_t c_cflag
 | |
| A bit mask specifying flags for control modes; see @ref{Control Modes}.
 | |
| 
 | |
| @item tcflag_t c_lflag
 | |
| A bit mask specifying flags for local modes; see @ref{Local Modes}.
 | |
| 
 | |
| @item cc_t c_cc[NCCS]
 | |
| An array specifying which characters are associated with various
 | |
| control functions; see @ref{Special Characters}.
 | |
| @end table
 | |
| 
 | |
| The @code{struct termios} structure also contains members which
 | |
| encode input and output transmission speeds, but the representation is
 | |
| not specified.  @xref{Line Speed}, for how to examine and store the
 | |
| speed values.
 | |
| @end deftp
 | |
| 
 | |
| The following sections describe the details of the members of the
 | |
| @code{struct termios} structure.
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftp {Data Type} tcflag_t
 | |
| This is an unsigned integer type used to represent the various
 | |
| bit masks for terminal flags.
 | |
| @end deftp
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftp {Data Type} cc_t
 | |
| This is an unsigned integer type used to represent characters associated
 | |
| with various terminal control functions.
 | |
| @end deftp
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro int NCCS
 | |
| The value of this macro is the number of elements in the @code{c_cc}
 | |
| array.
 | |
| @end deftypevr
 | |
| 
 | |
| @node Mode Functions
 | |
| @subsection Terminal Mode Functions
 | |
| @cindex terminal mode functions
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypefun int tcgetattr (int @var{filedes}, struct termios *@var{termios-p})
 | |
| This function is used to examine the attributes of the terminal
 | |
| device with file descriptor @var{filedes}.  The attributes are returned
 | |
| in the structure that @var{termios-p} points to.
 | |
| 
 | |
| If successful, @code{tcgetattr} returns @math{0}.  A return value of @math{-1}
 | |
| indicates an error.  The following @code{errno} error conditions are
 | |
| defined for this function:
 | |
| 
 | |
| @table @code
 | |
| @item EBADF
 | |
| The @var{filedes} argument is not a valid file descriptor.
 | |
| 
 | |
| @item ENOTTY
 | |
| The @var{filedes} is not associated with a terminal.
 | |
| @end table
 | |
| @end deftypefun
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypefun int tcsetattr (int @var{filedes}, int @var{when}, const struct termios *@var{termios-p})
 | |
| This function sets the attributes of the terminal device with file
 | |
| descriptor @var{filedes}.  The new attributes are taken from the
 | |
| structure that @var{termios-p} points to.
 | |
| 
 | |
| The @var{when} argument specifies how to deal with input and output
 | |
| already queued.  It can be one of the following values:
 | |
| 
 | |
| @table @code
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @item TCSANOW
 | |
| @vindex TCSANOW
 | |
| Make the change immediately.
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @item TCSADRAIN
 | |
| @vindex TCSADRAIN
 | |
| Make the change after waiting until all queued output has been written.
 | |
| You should usually use this option when changing parameters that affect
 | |
| output.
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @item TCSAFLUSH
 | |
| @vindex TCSAFLUSH
 | |
| This is like @code{TCSADRAIN}, but also discards any queued input.
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @item TCSASOFT
 | |
| @vindex TCSASOFT
 | |
| This is a flag bit that you can add to any of the above alternatives.
 | |
| Its meaning is to inhibit alteration of the state of the terminal
 | |
| hardware.  It is a BSD extension; it is only supported on BSD systems
 | |
| and the GNU system.
 | |
| 
 | |
| Using @code{TCSASOFT} is exactly the same as setting the @code{CIGNORE}
 | |
| bit in the @code{c_cflag} member of the structure @var{termios-p} points
 | |
| to.  @xref{Control Modes}, for a description of @code{CIGNORE}.
 | |
| @end table
 | |
| 
 | |
| If this function is called from a background process on its controlling
 | |
| terminal, normally all processes in the process group are sent a
 | |
| @code{SIGTTOU} signal, in the same way as if the process were trying to
 | |
| write to the terminal.  The exception is if the calling process itself
 | |
| is ignoring or blocking @code{SIGTTOU} signals, in which case the
 | |
| operation is performed and no signal is sent.  @xref{Job Control}.
 | |
| 
 | |
| If successful, @code{tcsetattr} returns @math{0}.  A return value of
 | |
| @math{-1} indicates an error.  The following @code{errno} error
 | |
| conditions are defined for this function:
 | |
| 
 | |
| @table @code
 | |
| @item EBADF
 | |
| The @var{filedes} argument is not a valid file descriptor.
 | |
| 
 | |
| @item ENOTTY
 | |
| The @var{filedes} is not associated with a terminal.
 | |
| 
 | |
| @item EINVAL
 | |
| Either the value of the @code{when} argument is not valid, or there is
 | |
| something wrong with the data in the @var{termios-p} argument.
 | |
| @end table
 | |
| @end deftypefun
 | |
| 
 | |
| Although @code{tcgetattr} and @code{tcsetattr} specify the terminal
 | |
| device with a file descriptor, the attributes are those of the terminal
 | |
| device itself and not of the file descriptor.  This means that the
 | |
| effects of changing terminal attributes are persistent; if another
 | |
| process opens the terminal file later on, it will see the changed
 | |
| attributes even though it doesn't have anything to do with the open file
 | |
| descriptor you originally specified in changing the attributes.
 | |
| 
 | |
| Similarly, if a single process has multiple or duplicated file
 | |
| descriptors for the same terminal device, changing the terminal
 | |
| attributes affects input and output to all of these file
 | |
| descriptors.  This means, for example, that you can't open one file
 | |
| descriptor or stream to read from a terminal in the normal
 | |
| line-buffered, echoed mode; and simultaneously have another file
 | |
| descriptor for the same terminal that you use to read from it in
 | |
| single-character, non-echoed mode.  Instead, you have to explicitly
 | |
| switch the terminal back and forth between the two modes.
 | |
| 
 | |
| @node Setting Modes
 | |
| @subsection Setting Terminal Modes Properly
 | |
| 
 | |
| When you set terminal modes, you should call @code{tcgetattr} first to
 | |
| get the current modes of the particular terminal device, modify only
 | |
| those modes that you are really interested in, and store the result with
 | |
| @code{tcsetattr}.
 | |
| 
 | |
| It's a bad idea to simply initialize a @code{struct termios} structure
 | |
| to a chosen set of attributes and pass it directly to @code{tcsetattr}.
 | |
| Your program may be run years from now, on systems that support members
 | |
| not documented in this manual.  The way to avoid setting these members
 | |
| to unreasonable values is to avoid changing them.
 | |
| 
 | |
| What's more, different terminal devices may require different mode
 | |
| settings in order to function properly.  So you should avoid blindly
 | |
| copying attributes from one terminal device to another.
 | |
| 
 | |
| When a member contains a collection of independent flags, as the
 | |
| @code{c_iflag}, @code{c_oflag} and @code{c_cflag} members do, even
 | |
| setting the entire member is a bad idea, because particular operating
 | |
| systems have their own flags.  Instead, you should start with the
 | |
| current value of the member and alter only the flags whose values matter
 | |
| in your program, leaving any other flags unchanged.
 | |
| 
 | |
| Here is an example of how to set one flag (@code{ISTRIP}) in the
 | |
| @code{struct termios} structure while properly preserving all the other
 | |
| data in the structure:
 | |
| 
 | |
| @smallexample
 | |
| @group
 | |
| int
 | |
| set_istrip (int desc, int value)
 | |
| @{
 | |
|   struct termios settings;
 | |
|   int result;
 | |
| @end group
 | |
| 
 | |
| @group
 | |
|   result = tcgetattr (desc, &settings);
 | |
|   if (result < 0)
 | |
|     @{
 | |
|       perror ("error in tcgetattr");
 | |
|       return 0;
 | |
|     @}
 | |
| @end group
 | |
| @group
 | |
|   settings.c_iflag &= ~ISTRIP;
 | |
|   if (value)
 | |
|     settings.c_iflag |= ISTRIP;
 | |
| @end group
 | |
| @group
 | |
|   result = tcsetattr (desc, TCSANOW, &settings);
 | |
|   if (result < 0)
 | |
|     @{
 | |
|       perror ("error in tcgetattr");
 | |
|       return;
 | |
|    @}
 | |
|   return 1;
 | |
| @}
 | |
| @end group
 | |
| @end smallexample
 | |
| 
 | |
| @node Input Modes
 | |
| @subsection Input Modes
 | |
| 
 | |
| This section describes the terminal attribute flags that control
 | |
| fairly low-level aspects of input processing: handling of parity errors,
 | |
| break signals, flow control, and @key{RET} and @key{LFD} characters.
 | |
| 
 | |
| All of these flags are bits in the @code{c_iflag} member of the
 | |
| @code{struct termios} structure.  The member is an integer, and you
 | |
| change flags using the operators @code{&}, @code{|} and @code{^}.  Don't
 | |
| try to specify the entire value for @code{c_iflag}---instead, change
 | |
| only specific flags and leave the rest untouched (@pxref{Setting
 | |
| Modes}).
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t INPCK
 | |
| @cindex parity checking
 | |
| If this bit is set, input parity checking is enabled.  If it is not set,
 | |
| no checking at all is done for parity errors on input; the
 | |
| characters are simply passed through to the application.
 | |
| 
 | |
| Parity checking on input processing is independent of whether parity
 | |
| detection and generation on the underlying terminal hardware is enabled;
 | |
| see @ref{Control Modes}.  For example, you could clear the @code{INPCK}
 | |
| input mode flag and set the @code{PARENB} control mode flag to ignore
 | |
| parity errors on input, but still generate parity on output.
 | |
| 
 | |
| If this bit is set, what happens when a parity error is detected depends
 | |
| on whether the @code{IGNPAR} or @code{PARMRK} bits are set.  If neither
 | |
| of these bits are set, a byte with a parity error is passed to the
 | |
| application as a @code{'\0'} character.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t IGNPAR
 | |
| If this bit is set, any byte with a framing or parity error is ignored.
 | |
| This is only useful if @code{INPCK} is also set.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t PARMRK
 | |
| If this bit is set, input bytes with parity or framing errors are marked
 | |
| when passed to the program.  This bit is meaningful only when
 | |
| @code{INPCK} is set and @code{IGNPAR} is not set.
 | |
| 
 | |
| The way erroneous bytes are marked is with two preceding bytes,
 | |
| @code{377} and @code{0}.  Thus, the program actually reads three bytes
 | |
| for one erroneous byte received from the terminal.
 | |
| 
 | |
| If a valid byte has the value @code{0377}, and @code{ISTRIP} (see below)
 | |
| is not set, the program might confuse it with the prefix that marks a
 | |
| parity error.  So a valid byte @code{0377} is passed to the program as
 | |
| two bytes, @code{0377} @code{0377}, in this case.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t ISTRIP
 | |
| If this bit is set, valid input bytes are stripped to seven bits;
 | |
| otherwise, all eight bits are available for programs to read.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t IGNBRK
 | |
| If this bit is set, break conditions are ignored.
 | |
| 
 | |
| @cindex break condition, detecting
 | |
| A @dfn{break condition} is defined in the context of asynchronous
 | |
| serial data transmission as a series of zero-value bits longer than a
 | |
| single byte.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t BRKINT
 | |
| If this bit is set and @code{IGNBRK} is not set, a break condition
 | |
| clears the terminal input and output queues and raises a @code{SIGINT}
 | |
| signal for the foreground process group associated with the terminal.
 | |
| 
 | |
| If neither @code{BRKINT} nor @code{IGNBRK} are set, a break condition is
 | |
| passed to the application as a single @code{'\0'} character if
 | |
| @code{PARMRK} is not set, or otherwise as a three-character sequence
 | |
| @code{'\377'}, @code{'\0'}, @code{'\0'}.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t IGNCR
 | |
| If this bit is set, carriage return characters (@code{'\r'}) are
 | |
| discarded on input.  Discarding carriage return may be useful on
 | |
| terminals that send both carriage return and linefeed when you type the
 | |
| @key{RET} key.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t ICRNL
 | |
| If this bit is set and @code{IGNCR} is not set, carriage return characters
 | |
| (@code{'\r'}) received as input are passed to the application as newline
 | |
| characters (@code{'\n'}).
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t INLCR
 | |
| If this bit is set, newline characters (@code{'\n'}) received as input
 | |
| are passed to the application as carriage return characters (@code{'\r'}).
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t IXOFF
 | |
| If this bit is set, start/stop control on input is enabled.  In other
 | |
| words, the computer sends STOP and START characters as necessary to
 | |
| prevent input from coming in faster than programs are reading it.  The
 | |
| idea is that the actual terminal hardware that is generating the input
 | |
| data responds to a STOP character by suspending transmission, and to a
 | |
| START character by resuming transmission.  @xref{Start/Stop Characters}.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t IXON
 | |
| If this bit is set, start/stop control on output is enabled.  In other
 | |
| words, if the computer receives a STOP character, it suspends output
 | |
| until a START character is received.  In this case, the STOP and START
 | |
| characters are never passed to the application program.  If this bit is
 | |
| not set, then START and STOP can be read as ordinary characters.
 | |
| @xref{Start/Stop Characters}.
 | |
| @c !!! mention this interferes with using C-s and C-q for programs like emacs
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro tcflag_t IXANY
 | |
| If this bit is set, any input character restarts output when output has
 | |
| been suspended with the STOP character.  Otherwise, only the START
 | |
| character restarts output.
 | |
| 
 | |
| This is a BSD extension; it exists only on BSD systems and the GNU system.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro tcflag_t IMAXBEL
 | |
| If this bit is set, then filling up the terminal input buffer sends a
 | |
| BEL character (code @code{007}) to the terminal to ring the bell.
 | |
| 
 | |
| This is a BSD extension.
 | |
| @end deftypevr
 | |
| 
 | |
| @node Output Modes
 | |
| @subsection Output Modes
 | |
| 
 | |
| This section describes the terminal flags and fields that control how
 | |
| output characters are translated and padded for display.  All of these
 | |
| are contained in the @code{c_oflag} member of the @w{@code{struct termios}}
 | |
| structure.
 | |
| 
 | |
| The @code{c_oflag} member itself is an integer, and you change the flags
 | |
| and fields using the operators @code{&}, @code{|}, and @code{^}.  Don't
 | |
| try to specify the entire value for @code{c_oflag}---instead, change
 | |
| only specific flags and leave the rest untouched (@pxref{Setting
 | |
| Modes}).
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t OPOST
 | |
| If this bit is set, output data is processed in some unspecified way so
 | |
| that it is displayed appropriately on the terminal device.  This
 | |
| typically includes mapping newline characters (@code{'\n'}) onto
 | |
| carriage return and linefeed pairs.
 | |
| 
 | |
| If this bit isn't set, the characters are transmitted as-is.
 | |
| @end deftypevr
 | |
| 
 | |
| The following three bits are BSD features, and they exist only BSD
 | |
| systems and the GNU system.  They are effective only if @code{OPOST} is
 | |
| set.
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro tcflag_t ONLCR
 | |
| If this bit is set, convert the newline character on output into a pair
 | |
| of characters, carriage return followed by linefeed.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro tcflag_t OXTABS
 | |
| If this bit is set, convert tab characters on output into the appropriate
 | |
| number of spaces to emulate a tab stop every eight columns.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro tcflag_t ONOEOT
 | |
| If this bit is set, discard @kbd{C-d} characters (code @code{004}) on
 | |
| output.  These characters cause many dial-up terminals to disconnect.
 | |
| @end deftypevr
 | |
| 
 | |
| @node Control Modes
 | |
| @subsection Control Modes
 | |
| 
 | |
| This section describes the terminal flags and fields that control
 | |
| parameters usually associated with asynchronous serial data
 | |
| transmission.  These flags may not make sense for other kinds of
 | |
| terminal ports (such as a network connection pseudo-terminal).  All of
 | |
| these are contained in the @code{c_cflag} member of the @code{struct
 | |
| termios} structure.
 | |
| 
 | |
| The @code{c_cflag} member itself is an integer, and you change the flags
 | |
| and fields using the operators @code{&}, @code{|}, and @code{^}.  Don't
 | |
| try to specify the entire value for @code{c_cflag}---instead, change
 | |
| only specific flags and leave the rest untouched (@pxref{Setting
 | |
| Modes}).
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t CLOCAL
 | |
| If this bit is set, it indicates that the terminal is connected
 | |
| ``locally'' and that the modem status lines (such as carrier detect)
 | |
| should be ignored.
 | |
| @cindex modem status lines
 | |
| @cindex carrier detect
 | |
| 
 | |
| On many systems if this bit is not set and you call @code{open} without
 | |
| the @code{O_NONBLOCK} flag set, @code{open} blocks until a modem
 | |
| connection is established.
 | |
| 
 | |
| If this bit is not set and a modem disconnect is detected, a
 | |
| @code{SIGHUP} signal is sent to the controlling process group for the
 | |
| terminal (if it has one).  Normally, this causes the process to exit;
 | |
| see @ref{Signal Handling}.  Reading from the terminal after a disconnect
 | |
| causes an end-of-file condition, and writing causes an @code{EIO} error
 | |
| to be returned.  The terminal device must be closed and reopened to
 | |
| clear the condition.
 | |
| @cindex modem disconnect
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t HUPCL
 | |
| If this bit is set, a modem disconnect is generated when all processes
 | |
| that have the terminal device open have either closed the file or exited.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t CREAD
 | |
| If this bit is set, input can be read from the terminal.  Otherwise,
 | |
| input is discarded when it arrives.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t CSTOPB
 | |
| If this bit is set, two stop bits are used.  Otherwise, only one stop bit
 | |
| is used.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t PARENB
 | |
| If this bit is set, generation and detection of a parity bit are enabled.
 | |
| @xref{Input Modes}, for information on how input parity errors are handled.
 | |
| 
 | |
| If this bit is not set, no parity bit is added to output characters, and
 | |
| input characters are not checked for correct parity.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t PARODD
 | |
| This bit is only useful if @code{PARENB} is set.  If @code{PARODD} is set,
 | |
| odd parity is used, otherwise even parity is used.
 | |
| @end deftypevr
 | |
| 
 | |
| The control mode flags also includes a field for the number of bits per
 | |
| character.  You can use the @code{CSIZE} macro as a mask to extract the
 | |
| value, like this: @code{settings.c_cflag & CSIZE}.
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t CSIZE
 | |
| This is a mask for the number of bits per character.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t CS5
 | |
| This specifies five bits per byte.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t CS6
 | |
| This specifies six bits per byte.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t CS7
 | |
| This specifies seven bits per byte.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t CS8
 | |
| This specifies eight bits per byte.
 | |
| @end deftypevr
 | |
| 
 | |
| The following four bits are BSD extensions; this exist only on BSD
 | |
| systems and the GNU system.
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro tcflag_t CCTS_OFLOW
 | |
| If this bit is set, enable flow control of output based on the CTS wire
 | |
| (RS232 protocol).
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro tcflag_t CRTS_IFLOW
 | |
| If this bit is set, enable flow control of input based on the RTS wire
 | |
| (RS232 protocol).
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro tcflag_t MDMBUF
 | |
| If this bit is set, enable carrier-based flow control of output.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro tcflag_t CIGNORE
 | |
| If this bit is set, it says to ignore the control modes and line speed
 | |
| values entirely.  This is only meaningful in a call to @code{tcsetattr}.
 | |
| 
 | |
| The @code{c_cflag} member and the line speed values returned by
 | |
| @code{cfgetispeed} and @code{cfgetospeed} will be unaffected by the
 | |
| call.  @code{CIGNORE} is useful if you want to set all the software
 | |
| modes in the other members, but leave the hardware details in
 | |
| @code{c_cflag} unchanged.  (This is how the @code{TCSASOFT} flag to
 | |
| @code{tcsettattr} works.)
 | |
| 
 | |
| This bit is never set in the structure filled in by @code{tcgetattr}.
 | |
| @end deftypevr
 | |
| 
 | |
| @node Local Modes
 | |
| @subsection Local Modes
 | |
| 
 | |
| This section describes the flags for the @code{c_lflag} member of the
 | |
| @code{struct termios} structure.  These flags generally control
 | |
| higher-level aspects of input processing than the input modes flags
 | |
| described in @ref{Input Modes}, such as echoing, signals, and the choice
 | |
| of canonical or noncanonical input.
 | |
| 
 | |
| The @code{c_lflag} member itself is an integer, and you change the flags
 | |
| and fields using the operators @code{&}, @code{|}, and @code{^}.  Don't
 | |
| try to specify the entire value for @code{c_lflag}---instead, change
 | |
| only specific flags and leave the rest untouched (@pxref{Setting
 | |
| Modes}).
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t ICANON
 | |
| This bit, if set, enables canonical input processing mode.  Otherwise,
 | |
| input is processed in noncanonical mode.  @xref{Canonical or Not}.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t ECHO
 | |
| If this bit is set, echoing of input characters back to the terminal
 | |
| is enabled.
 | |
| @cindex echo of terminal input
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t ECHOE
 | |
| If this bit is set, echoing indicates erasure of input with the ERASE
 | |
| character by erasing the last character in the current line from the
 | |
| screen.  Otherwise, the character erased is re-echoed to show what has
 | |
| happened (suitable for a printing terminal).
 | |
| 
 | |
| This bit only controls the display behavior; the @code{ICANON} bit by
 | |
| itself controls actual recognition of the ERASE character and erasure of
 | |
| input, without which @code{ECHOE} is simply irrelevant.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro tcflag_t ECHOPRT
 | |
| This bit is like @code{ECHOE}, enables display of the ERASE character in
 | |
| a way that is geared to a hardcopy terminal.  When you type the ERASE
 | |
| character, a @samp{\} character is printed followed by the first
 | |
| character erased.  Typing the ERASE character again just prints the next
 | |
| character erased.  Then, the next time you type a normal character, a
 | |
| @samp{/} character is printed before the character echoes.
 | |
| 
 | |
| This is a BSD extension, and exists only in BSD systems and the
 | |
| GNU system.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t ECHOK
 | |
| This bit enables special display of the KILL character by moving to a
 | |
| new line after echoing the KILL character normally.  The behavior of
 | |
| @code{ECHOKE} (below) is nicer to look at.
 | |
| 
 | |
| If this bit is not set, the KILL character echoes just as it would if it
 | |
| were not the KILL character.  Then it is up to the user to remember that
 | |
| the KILL character has erased the preceding input; there is no
 | |
| indication of this on the screen.
 | |
| 
 | |
| This bit only controls the display behavior; the @code{ICANON} bit by
 | |
| itself controls actual recognition of the KILL character and erasure of
 | |
| input, without which @code{ECHOK} is simply irrelevant.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro tcflag_t ECHOKE
 | |
| This bit is similar to @code{ECHOK}.  It enables special display of the
 | |
| KILL character by erasing on the screen the entire line that has been
 | |
| killed.  This is a BSD extension, and exists only in BSD systems and the
 | |
| GNU system.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t ECHONL
 | |
| If this bit is set and the @code{ICANON} bit is also set, then the
 | |
| newline (@code{'\n'}) character is echoed even if the @code{ECHO} bit
 | |
| is not set.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro tcflag_t ECHOCTL
 | |
| If this bit is set and the @code{ECHO} bit is also set, echo control
 | |
| characters with @samp{^} followed by the corresponding text character.
 | |
| Thus, control-A echoes as @samp{^A}.  This is usually the preferred mode
 | |
| for interactive input, because echoing a control character back to the
 | |
| terminal could have some undesired effect on the terminal.
 | |
| 
 | |
| This is a BSD extension, and exists only in BSD systems and the
 | |
| GNU system.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t ISIG
 | |
| This bit controls whether the INTR, QUIT, and SUSP characters are
 | |
| recognized.  The functions associated with these characters are performed
 | |
| if and only if this bit is set.  Being in canonical or noncanonical
 | |
| input mode has no affect on the interpretation of these characters.
 | |
| 
 | |
| You should use caution when disabling recognition of these characters.
 | |
| Programs that cannot be interrupted interactively are very
 | |
| user-unfriendly.  If you clear this bit, your program should provide
 | |
| some alternate interface that allows the user to interactively send the
 | |
| signals associated with these characters, or to escape from the program.
 | |
| @cindex interactive signals, from terminal
 | |
| 
 | |
| @xref{Signal Characters}.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t IEXTEN
 | |
| POSIX.1 gives @code{IEXTEN} implementation-defined meaning,
 | |
| so you cannot rely on this interpretation on all systems.
 | |
| 
 | |
| On BSD systems and the GNU system, it enables the LNEXT and DISCARD characters.
 | |
| @xref{Other Special}.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t NOFLSH
 | |
| Normally, the INTR, QUIT, and SUSP characters cause input and output
 | |
| queues for the terminal to be cleared.  If this bit is set, the queues
 | |
| are not cleared.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro tcflag_t TOSTOP
 | |
| If this bit is set and the system supports job control, then
 | |
| @code{SIGTTOU} signals are generated by background processes that
 | |
| attempt to write to the terminal.  @xref{Access to the Terminal}.
 | |
| @end deftypevr
 | |
| 
 | |
| The following bits are BSD extensions; they exist only in BSD systems
 | |
| and the GNU system.
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro tcflag_t ALTWERASE
 | |
| This bit determines how far the WERASE character should erase.  The
 | |
| WERASE character erases back to the beginning of a word; the question
 | |
| is, where do words begin?
 | |
| 
 | |
| If this bit is clear, then the beginning of a word is a nonwhitespace
 | |
| character following a whitespace character.  If the bit is set, then the
 | |
| beginning of a word is an alphanumeric character or underscore following
 | |
| a character which is none of those.
 | |
| 
 | |
| @xref{Editing Characters}, for more information about the WERASE character.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro tcflag_t FLUSHO
 | |
| This is the bit that toggles when the user types the DISCARD character.
 | |
| While this bit is set, all output is discarded.  @xref{Other Special}.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro tcflag_t NOKERNINFO
 | |
| Setting this bit disables handling of the STATUS character.
 | |
| @xref{Other Special}.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro tcflag_t PENDIN
 | |
| If this bit is set, it indicates that there is a line of input that
 | |
| needs to be reprinted.  Typing the REPRINT character sets this bit; the
 | |
| bit remains set until reprinting is finished.  @xref{Editing Characters}.
 | |
| @end deftypevr
 | |
| 
 | |
| @c EXTPROC is too obscure to document now.  --roland
 | |
| 
 | |
| @node Line Speed
 | |
| @subsection Line Speed
 | |
| @cindex line speed
 | |
| @cindex baud rate
 | |
| @cindex terminal line speed
 | |
| @cindex terminal line speed
 | |
| 
 | |
| The terminal line speed tells the computer how fast to read and write
 | |
| data on the terminal.
 | |
| 
 | |
| If the terminal is connected to a real serial line, the terminal speed
 | |
| you specify actually controls the line---if it doesn't match the
 | |
| terminal's own idea of the speed, communication does not work.  Real
 | |
| serial ports accept only certain standard speeds.  Also, particular
 | |
| hardware may not support even all the standard speeds.  Specifying a
 | |
| speed of zero hangs up a dialup connection and turns off modem control
 | |
| signals.
 | |
| 
 | |
| If the terminal is not a real serial line (for example, if it is a
 | |
| network connection), then the line speed won't really affect data
 | |
| transmission speed, but some programs will use it to determine the
 | |
| amount of padding needed.  It's best to specify a line speed value that
 | |
| matches the actual speed of the actual terminal, but you can safely
 | |
| experiment with different values to vary the amount of padding.
 | |
| 
 | |
| There are actually two line speeds for each terminal, one for input and
 | |
| one for output.  You can set them independently, but most often
 | |
| terminals use the same speed for both directions.
 | |
| 
 | |
| The speed values are stored in the @code{struct termios} structure, but
 | |
| don't try to access them in the @code{struct termios} structure
 | |
| directly.  Instead, you should use the following functions to read and
 | |
| store them:
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypefun speed_t cfgetospeed (const struct termios *@var{termios-p})
 | |
| This function returns the output line speed stored in the structure
 | |
| @code{*@var{termios-p}}.
 | |
| @end deftypefun
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypefun speed_t cfgetispeed (const struct termios *@var{termios-p})
 | |
| This function returns the input line speed stored in the structure
 | |
| @code{*@var{termios-p}}.
 | |
| @end deftypefun
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypefun int cfsetospeed (struct termios *@var{termios-p}, speed_t @var{speed})
 | |
| This function stores @var{speed} in @code{*@var{termios-p}} as the output
 | |
| speed.  The normal return value is @math{0}; a value of @math{-1}
 | |
| indicates an error.  If @var{speed} is not a speed, @code{cfsetospeed}
 | |
| returns @math{-1}.
 | |
| @end deftypefun
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypefun int cfsetispeed (struct termios *@var{termios-p}, speed_t @var{speed})
 | |
| This function stores @var{speed} in @code{*@var{termios-p}} as the input
 | |
| speed.  The normal return value is @math{0}; a value of @math{-1}
 | |
| indicates an error.  If @var{speed} is not a speed, @code{cfsetospeed}
 | |
| returns @math{-1}.
 | |
| @end deftypefun
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypefun int cfsetspeed (struct termios *@var{termios-p}, speed_t @var{speed})
 | |
| This function stores @var{speed} in @code{*@var{termios-p}} as both the
 | |
| input and output speeds.  The normal return value is @math{0}; a value
 | |
| of @math{-1} indicates an error.  If @var{speed} is not a speed,
 | |
| @code{cfsetspeed} returns @math{-1}.  This function is an extension in
 | |
| 4.4 BSD.
 | |
| @end deftypefun
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftp {Data Type} speed_t
 | |
| The @code{speed_t} type is an unsigned integer data type used to
 | |
| represent line speeds.
 | |
| @end deftp
 | |
| 
 | |
| The functions @code{cfsetospeed} and @code{cfsetispeed} report errors
 | |
| only for speed values that the system simply cannot handle.  If you
 | |
| specify a speed value that is basically acceptable, then those functions
 | |
| will succeed.  But they do not check that a particular hardware device
 | |
| can actually support the specified speeds---in fact, they don't know
 | |
| which device you plan to set the speed for.  If you use @code{tcsetattr}
 | |
| to set the speed of a particular device to a value that it cannot
 | |
| handle, @code{tcsetattr} returns @math{-1}.
 | |
| 
 | |
| @strong{Portability note:} In the GNU library, the functions above
 | |
| accept speeds measured in bits per second as input, and return speed
 | |
| values measured in bits per second.  Other libraries require speeds to
 | |
| be indicated by special codes.  For POSIX.1 portability, you must use
 | |
| one of the following symbols to represent the speed; their precise
 | |
| numeric values are system-dependent, but each name has a fixed meaning:
 | |
| @code{B110} stands for 110 bps, @code{B300} for 300 bps, and so on.
 | |
| There is no portable way to represent any speed but these, but these are
 | |
| the only speeds that typical serial lines can support.
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @vindex B0
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @vindex B50
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @vindex B75
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @vindex B110
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @vindex B134
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @vindex B150
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @vindex B200
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @vindex B300
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @vindex B600
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @vindex B1200
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @vindex B1800
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @vindex B2400
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @vindex B4800
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @vindex B9600
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @vindex B19200
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @vindex B38400
 | |
| @comment termios.h
 | |
| @comment GNU
 | |
| @vindex B57600
 | |
| @comment termios.h
 | |
| @comment GNU
 | |
| @vindex B115200
 | |
| @comment termios.h
 | |
| @comment GNU
 | |
| @vindex B230400
 | |
| @comment termios.h
 | |
| @comment GNU
 | |
| @vindex B460800
 | |
| @smallexample
 | |
| B0  B50  B75  B110  B134  B150  B200
 | |
| B300  B600  B1200  B1800  B2400  B4800
 | |
| B9600  B19200  B38400  B57600  B115200
 | |
| B230400  B460800
 | |
| @end smallexample
 | |
| 
 | |
| @vindex EXTA
 | |
| @vindex EXTB
 | |
| BSD defines two additional speed symbols as aliases: @code{EXTA} is an
 | |
| alias for @code{B19200} and @code{EXTB} is an alias for @code{B38400}.
 | |
| These aliases are obsolete.
 | |
| 
 | |
| @node Special Characters
 | |
| @subsection Special Characters
 | |
| 
 | |
| In canonical input, the terminal driver recognizes a number of special
 | |
| characters which perform various control functions.  These include the
 | |
| ERASE character (usually @key{DEL}) for editing input, and other editing
 | |
| characters.  The INTR character (normally @kbd{C-c}) for sending a
 | |
| @code{SIGINT} signal, and other signal-raising characters, may be
 | |
| available in either canonical or noncanonical input mode.  All these
 | |
| characters are described in this section.
 | |
| 
 | |
| The particular characters used are specified in the @code{c_cc} member
 | |
| of the @code{struct termios} structure.  This member is an array; each
 | |
| element specifies the character for a particular role.  Each element has
 | |
| a symbolic constant that stands for the index of that element---for
 | |
| example, @code{VINTR} is the index of the element that specifies the INTR
 | |
| character, so storing @code{'='} in @code{@var{termios}.c_cc[VINTR]}
 | |
| specifies @samp{=} as the INTR character.
 | |
| 
 | |
| @vindex _POSIX_VDISABLE
 | |
| On some systems, you can disable a particular special character function
 | |
| by specifying the value @code{_POSIX_VDISABLE} for that role.  This
 | |
| value is unequal to any possible character code.  @xref{Options for
 | |
| Files}, for more information about how to tell whether the operating
 | |
| system you are using supports @code{_POSIX_VDISABLE}.
 | |
| 
 | |
| @menu
 | |
| * Editing Characters::          Special characters that terminate lines and
 | |
|                                   delete text, and other editing functions.
 | |
| * Signal Characters::           Special characters that send or raise signals
 | |
|                                   to or for certain classes of processes.
 | |
| * Start/Stop Characters::       Special characters that suspend or resume
 | |
|                                   suspended output.
 | |
| * Other Special::		Other special characters for BSD systems:
 | |
| 				  they can discard output, and print status.
 | |
| @end menu
 | |
| 
 | |
| @node Editing Characters
 | |
| @subsubsection Characters for Input Editing
 | |
| 
 | |
| These special characters are active only in canonical input mode.
 | |
| @xref{Canonical or Not}.
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro int VEOF
 | |
| @cindex EOF character
 | |
| This is the subscript for the EOF character in the special control
 | |
| character array.  @code{@var{termios}.c_cc[VEOF]} holds the character
 | |
| itself.
 | |
| 
 | |
| The EOF character is recognized only in canonical input mode.  It acts
 | |
| as a line terminator in the same way as a newline character, but if the
 | |
| EOF character is typed at the beginning of a line it causes @code{read}
 | |
| to return a byte count of zero, indicating end-of-file.  The EOF
 | |
| character itself is discarded.
 | |
| 
 | |
| Usually, the EOF character is @kbd{C-d}.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro int VEOL
 | |
| @cindex EOL character
 | |
| This is the subscript for the EOL character in the special control
 | |
| character array.  @code{@var{termios}.c_cc[VEOL]} holds the character
 | |
| itself.
 | |
| 
 | |
| The EOL character is recognized only in canonical input mode.  It acts
 | |
| as a line terminator, just like a newline character.  The EOL character
 | |
| is not discarded; it is read as the last character in the input line.
 | |
| 
 | |
| @c !!! example: this is set to ESC by 4.3 csh with "set filec" so it can
 | |
| @c complete partial lines without using cbreak or raw mode.
 | |
| 
 | |
| You don't need to use the EOL character to make @key{RET} end a line.
 | |
| Just set the ICRNL flag.  In fact, this is the default state of
 | |
| affairs.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro int VEOL2
 | |
| @cindex EOL2 character
 | |
| This is the subscript for the EOL2 character in the special control
 | |
| character array.  @code{@var{termios}.c_cc[VEOL2]} holds the character
 | |
| itself.
 | |
| 
 | |
| The EOL2 character works just like the EOL character (see above), but it
 | |
| can be a different character.  Thus, you can specify two characters to
 | |
| terminate an input line, by setting EOL to one of them and EOL2 to the
 | |
| other.
 | |
| 
 | |
| The EOL2 character is a BSD extension; it exists only on BSD systems
 | |
| and the GNU system.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro int VERASE
 | |
| @cindex ERASE character
 | |
| This is the subscript for the ERASE character in the special control
 | |
| character array.  @code{@var{termios}.c_cc[VERASE]} holds the
 | |
| character itself.
 | |
| 
 | |
| The ERASE character is recognized only in canonical input mode.  When
 | |
| the user types the erase character, the previous character typed is
 | |
| discarded.  (If the terminal generates multibyte character sequences,
 | |
| this may cause more than one byte of input to be discarded.)  This
 | |
| cannot be used to erase past the beginning of the current line of text.
 | |
| The ERASE character itself is discarded.
 | |
| @c !!! mention ECHOE here
 | |
| 
 | |
| Usually, the ERASE character is @key{DEL}.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro int VWERASE
 | |
| @cindex WERASE character
 | |
| This is the subscript for the WERASE character in the special control
 | |
| character array.  @code{@var{termios}.c_cc[VWERASE]} holds the character
 | |
| itself.
 | |
| 
 | |
| The WERASE character is recognized only in canonical mode.  It erases an
 | |
| entire word of prior input, and any whitespace after it; whitespace
 | |
| characters before the word are not erased.
 | |
| 
 | |
| The definition of a ``word'' depends on the setting of the
 | |
| @code{ALTWERASE} mode; @pxref{Local Modes}.
 | |
| 
 | |
| If the @code{ALTWERASE} mode is not set, a word is defined as a sequence
 | |
| of any characters except space or tab.
 | |
| 
 | |
| If the @code{ALTWERASE} mode is set, a word is defined as a sequence of
 | |
| characters containing only letters, numbers, and underscores, optionally
 | |
| followed by one character that is not a letter, number, or underscore.
 | |
| 
 | |
| The WERASE character is usually @kbd{C-w}.
 | |
| 
 | |
| This is a BSD extension.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro int VKILL
 | |
| @cindex KILL character
 | |
| This is the subscript for the KILL character in the special control
 | |
| character array.  @code{@var{termios}.c_cc[VKILL]} holds the character
 | |
| itself.
 | |
| 
 | |
| The KILL character is recognized only in canonical input mode.  When the
 | |
| user types the kill character, the entire contents of the current line
 | |
| of input are discarded.  The kill character itself is discarded too.
 | |
| 
 | |
| The KILL character is usually @kbd{C-u}.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro int VREPRINT
 | |
| @cindex REPRINT character
 | |
| This is the subscript for the REPRINT character in the special control
 | |
| character array.  @code{@var{termios}.c_cc[VREPRINT]} holds the character
 | |
| itself.
 | |
| 
 | |
| The REPRINT character is recognized only in canonical mode.  It reprints
 | |
| the current input line.  If some asynchronous output has come while you
 | |
| are typing, this lets you see the line you are typing clearly again.
 | |
| 
 | |
| The REPRINT character is usually @kbd{C-r}.
 | |
| 
 | |
| This is a BSD extension.
 | |
| @end deftypevr
 | |
| 
 | |
| @node Signal Characters
 | |
| @subsubsection Characters that Cause Signals
 | |
| 
 | |
| These special characters may be active in either canonical or noncanonical
 | |
| input mode, but only when the @code{ISIG} flag is set (@pxref{Local
 | |
| Modes}).
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro int VINTR
 | |
| @cindex INTR character
 | |
| @cindex interrupt character
 | |
| This is the subscript for the INTR character in the special control
 | |
| character array.  @code{@var{termios}.c_cc[VINTR]} holds the character
 | |
| itself.
 | |
| 
 | |
| The INTR (interrupt) character raises a @code{SIGINT} signal for all
 | |
| processes in the foreground job associated with the terminal.  The INTR
 | |
| character itself is then discarded.  @xref{Signal Handling}, for more
 | |
| information about signals.
 | |
| 
 | |
| Typically, the INTR character is @kbd{C-c}.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro int VQUIT
 | |
| @cindex QUIT character
 | |
| This is the subscript for the QUIT character in the special control
 | |
| character array.  @code{@var{termios}.c_cc[VQUIT]} holds the character
 | |
| itself.
 | |
| 
 | |
| The QUIT character raises a @code{SIGQUIT} signal for all processes in
 | |
| the foreground job associated with the terminal.  The QUIT character
 | |
| itself is then discarded.  @xref{Signal Handling}, for more information
 | |
| about signals.
 | |
| 
 | |
| Typically, the QUIT character is @kbd{C-\}.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro int VSUSP
 | |
| @cindex SUSP character
 | |
| @cindex suspend character
 | |
| This is the subscript for the SUSP character in the special control
 | |
| character array.  @code{@var{termios}.c_cc[VSUSP]} holds the character
 | |
| itself.
 | |
| 
 | |
| The SUSP (suspend) character is recognized only if the implementation
 | |
| supports job control (@pxref{Job Control}).  It causes a @code{SIGTSTP}
 | |
| signal to be sent to all processes in the foreground job associated with
 | |
| the terminal.  The SUSP character itself is then discarded.
 | |
| @xref{Signal Handling}, for more information about signals.
 | |
| 
 | |
| Typically, the SUSP character is @kbd{C-z}.
 | |
| @end deftypevr
 | |
| 
 | |
| Few applications disable the normal interpretation of the SUSP
 | |
| character.  If your program does this, it should provide some other
 | |
| mechanism for the user to stop the job.  When the user invokes this
 | |
| mechanism, the program should send a @code{SIGTSTP} signal to the
 | |
| process group of the process, not just to the process itself.
 | |
| @xref{Signaling Another Process}.
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro int VDSUSP
 | |
| @cindex DSUSP character
 | |
| @cindex delayed suspend character
 | |
| This is the subscript for the DSUSP character in the special control
 | |
| character array.  @code{@var{termios}.c_cc[VDSUSP]} holds the character
 | |
| itself.
 | |
| 
 | |
| The DSUSP (suspend) character is recognized only if the implementation
 | |
| supports job control (@pxref{Job Control}).  It sends a @code{SIGTSTP}
 | |
| signal, like the SUSP character, but not right away---only when the
 | |
| program tries to read it as input.  Not all systems with job control
 | |
| support DSUSP; only BSD-compatible systems (including the GNU system).
 | |
| 
 | |
| @xref{Signal Handling}, for more information about signals.
 | |
| 
 | |
| Typically, the DSUSP character is @kbd{C-y}.
 | |
| @end deftypevr
 | |
| 
 | |
| @node Start/Stop Characters
 | |
| @subsubsection Special Characters for Flow Control
 | |
| 
 | |
| These special characters may be active in either canonical or noncanonical
 | |
| input mode, but their use is controlled by the flags @code{IXON} and
 | |
| @code{IXOFF} (@pxref{Input Modes}).
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro int VSTART
 | |
| @cindex START character
 | |
| This is the subscript for the START character in the special control
 | |
| character array.  @code{@var{termios}.c_cc[VSTART]} holds the
 | |
| character itself.
 | |
| 
 | |
| The START character is used to support the @code{IXON} and @code{IXOFF}
 | |
| input modes.  If @code{IXON} is set, receiving a START character resumes
 | |
| suspended output; the START character itself is discarded.  If
 | |
| @code{IXANY} is set, receiving any character at all resumes suspended
 | |
| output; the resuming character is not discarded unless it is the START
 | |
| character.  @code{IXOFF} is set, the system may also transmit START
 | |
| characters to the terminal.
 | |
| 
 | |
| The usual value for the START character is @kbd{C-q}.  You may not be
 | |
| able to change this value---the hardware may insist on using @kbd{C-q}
 | |
| regardless of what you specify.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro int VSTOP
 | |
| @cindex STOP character
 | |
| This is the subscript for the STOP character in the special control
 | |
| character array.  @code{@var{termios}.c_cc[VSTOP]} holds the character
 | |
| itself.
 | |
| 
 | |
| The STOP character is used to support the @code{IXON} and @code{IXOFF}
 | |
| input modes.  If @code{IXON} is set, receiving a STOP character causes
 | |
| output to be suspended; the STOP character itself is discarded.  If
 | |
| @code{IXOFF} is set, the system may also transmit STOP characters to the
 | |
| terminal, to prevent the input queue from overflowing.
 | |
| 
 | |
| The usual value for the STOP character is @kbd{C-s}.  You may not be
 | |
| able to change this value---the hardware may insist on using @kbd{C-s}
 | |
| regardless of what you specify.
 | |
| @end deftypevr
 | |
| 
 | |
| @node Other Special
 | |
| @subsubsection Other Special Characters
 | |
| 
 | |
| These special characters exist only in BSD systems and the GNU system.
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro int VLNEXT
 | |
| @cindex LNEXT character
 | |
| This is the subscript for the LNEXT character in the special control
 | |
| character array.  @code{@var{termios}.c_cc[VLNEXT]} holds the character
 | |
| itself.
 | |
| 
 | |
| The LNEXT character is recognized only when @code{IEXTEN} is set, but in
 | |
| both canonical and noncanonical mode.  It disables any special
 | |
| significance of the next character the user types.  Even if the
 | |
| character would normally perform some editing function or generate a
 | |
| signal, it is read as a plain character.  This is the analogue of the
 | |
| @kbd{C-q} command in Emacs.  ``LNEXT'' stands for ``literal next.''
 | |
| 
 | |
| The LNEXT character is usually @kbd{C-v}.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro int VDISCARD
 | |
| @cindex DISCARD character
 | |
| This is the subscript for the DISCARD character in the special control
 | |
| character array.  @code{@var{termios}.c_cc[VDISCARD]} holds the character
 | |
| itself.
 | |
| 
 | |
| The DISCARD character is recognized only when @code{IEXTEN} is set, but
 | |
| in both canonical and noncanonical mode.  Its effect is to toggle the
 | |
| discard-output flag.  When this flag is set, all program output is
 | |
| discarded.  Setting the flag also discards all output currently in the
 | |
| output buffer.  Typing any other character resets the flag.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypevr Macro int VSTATUS
 | |
| @cindex STATUS character
 | |
| This is the subscript for the STATUS character in the special control
 | |
| character array.  @code{@var{termios}.c_cc[VSTATUS]} holds the character
 | |
| itself.
 | |
| 
 | |
| The STATUS character's effect is to print out a status message about how
 | |
| the current process is running.
 | |
| 
 | |
| The STATUS character is recognized only in canonical mode, and only if
 | |
| @code{NOKERNINFO} is not set.
 | |
| @end deftypevr
 | |
| 
 | |
| @node Noncanonical Input
 | |
| @subsection Noncanonical Input
 | |
| 
 | |
| In noncanonical input mode, the special editing characters such as
 | |
| ERASE and KILL are ignored.  The system facilities for the user to edit
 | |
| input are disabled in noncanonical mode, so that all input characters
 | |
| (unless they are special for signal or flow-control purposes) are passed
 | |
| to the application program exactly as typed.  It is up to the
 | |
| application program to give the user ways to edit the input, if
 | |
| appropriate.
 | |
| 
 | |
| Noncanonical mode offers special parameters called MIN and TIME for
 | |
| controlling whether and how long to wait for input to be available.  You
 | |
| can even use them to avoid ever waiting---to return immediately with
 | |
| whatever input is available, or with no input.
 | |
| 
 | |
| The MIN and TIME are stored in elements of the @code{c_cc} array, which
 | |
| is a member of the @w{@code{struct termios}} structure.  Each element of
 | |
| this array has a particular role, and each element has a symbolic
 | |
| constant that stands for the index of that element.  @code{VMIN} and
 | |
| @code{VMAX} are the names for the indices in the array of the MIN and
 | |
| TIME slots.
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro int VMIN
 | |
| @cindex MIN termios slot
 | |
| This is the subscript for the MIN slot in the @code{c_cc} array.  Thus,
 | |
| @code{@var{termios}.c_cc[VMIN]} is the value itself.
 | |
| 
 | |
| The MIN slot is only meaningful in noncanonical input mode; it
 | |
| specifies the minimum number of bytes that must be available in the
 | |
| input queue in order for @code{read} to return.
 | |
| @end deftypevr
 | |
| 
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypevr Macro int VTIME
 | |
| @cindex TIME termios slot
 | |
| This is the subscript for the TIME slot in the @code{c_cc} array.  Thus,
 | |
| @code{@var{termios}.c_cc[VTIME]} is the value itself.
 | |
| 
 | |
| The TIME slot is only meaningful in noncanonical input mode; it
 | |
| specifies how long to wait for input before returning, in units of 0.1
 | |
| seconds.
 | |
| @end deftypevr
 | |
| 
 | |
| The MIN and TIME values interact to determine the criterion for when
 | |
| @code{read} should return; their precise meanings depend on which of
 | |
| them are nonzero.  There are four possible cases:
 | |
| 
 | |
| @itemize @bullet
 | |
| @item
 | |
| Both TIME and MIN are nonzero.
 | |
| 
 | |
| In this case, TIME specifies how long to wait after each input character
 | |
| to see if more input arrives.  After the first character received,
 | |
| @code{read} keeps waiting until either MIN bytes have arrived in all, or
 | |
| TIME elapses with no further input.
 | |
| 
 | |
| @code{read} always blocks until the first character arrives, even if
 | |
| TIME elapses first.  @code{read} can return more than MIN characters if
 | |
| more than MIN happen to be in the queue.
 | |
| 
 | |
| @item
 | |
| Both MIN and TIME are zero.
 | |
| 
 | |
| In this case, @code{read} always returns immediately with as many
 | |
| characters as are available in the queue, up to the number requested.
 | |
| If no input is immediately available, @code{read} returns a value of
 | |
| zero.
 | |
| 
 | |
| @item
 | |
| MIN is zero but TIME has a nonzero value.
 | |
| 
 | |
| In this case, @code{read} waits for time TIME for input to become
 | |
| available; the availability of a single byte is enough to satisfy the
 | |
| read request and cause @code{read} to return.  When it returns, it
 | |
| returns as many characters as are available, up to the number requested.
 | |
| If no input is available before the timer expires, @code{read} returns a
 | |
| value of zero.
 | |
| 
 | |
| @item
 | |
| TIME is zero but MIN has a nonzero value.
 | |
| 
 | |
| In this case, @code{read} waits until at least MIN bytes are available
 | |
| in the queue.  At that time, @code{read} returns as many characters as
 | |
| are available, up to the number requested.  @code{read} can return more
 | |
| than MIN characters if more than MIN happen to be in the queue.
 | |
| @end itemize
 | |
| 
 | |
| What happens if MIN is 50 and you ask to read just 10 bytes?
 | |
| Normally, @code{read} waits until there are 50 bytes in the buffer (or,
 | |
| more generally, the wait condition described above is satisfied), and
 | |
| then reads 10 of them, leaving the other 40 buffered in the operating
 | |
| system for a subsequent call to @code{read}.
 | |
| 
 | |
| @strong{Portability note:} On some systems, the MIN and TIME slots are
 | |
| actually the same as the EOF and EOL slots.  This causes no serious
 | |
| problem because the MIN and TIME slots are used only in noncanonical
 | |
| input and the EOF and EOL slots are used only in canonical input, but it
 | |
| isn't very clean.  The GNU library allocates separate slots for these
 | |
| uses.
 | |
| 
 | |
| @comment termios.h
 | |
| @comment BSD
 | |
| @deftypefun int cfmakeraw (struct termios *@var{termios-p})
 | |
| This function provides an easy way to set up @code{*@var{termios-p}} for
 | |
| what has traditionally been called ``raw mode'' in BSD.  This uses
 | |
| noncanonical input, and turns off most processing to give an unmodified
 | |
| channel to the terminal.
 | |
| 
 | |
| It does exactly this:
 | |
| @smallexample
 | |
|   @var{termios-p}->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
 | |
|                                 |INLCR|IGNCR|ICRNL|IXON);
 | |
|   @var{termios-p}->c_oflag &= ~OPOST;
 | |
|   @var{termios-p}->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
 | |
|   @var{termios-p}->c_cflag &= ~(CSIZE|PARENB);
 | |
|   @var{termios-p}->c_cflag |= CS8;
 | |
| @end smallexample
 | |
| @end deftypefun
 | |
| 
 | |
| @node Line Control
 | |
| @section Line Control Functions
 | |
| @cindex terminal line control functions
 | |
| 
 | |
| These functions perform miscellaneous control actions on terminal
 | |
| devices.  As regards terminal access, they are treated like doing
 | |
| output: if any of these functions is used by a background process on its
 | |
| controlling terminal, normally all processes in the process group are
 | |
| sent a @code{SIGTTOU} signal.  The exception is if the calling process
 | |
| itself is ignoring or blocking @code{SIGTTOU} signals, in which case the
 | |
| operation is performed and no signal is sent.  @xref{Job Control}.
 | |
| 
 | |
| @cindex break condition, generating
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypefun int tcsendbreak (int @var{filedes}, int @var{duration})
 | |
| This function generates a break condition by transmitting a stream of
 | |
| zero bits on the terminal associated with the file descriptor
 | |
| @var{filedes}.  The duration of the break is controlled by the
 | |
| @var{duration} argument.  If zero, the duration is between 0.25 and 0.5
 | |
| seconds.  The meaning of a nonzero value depends on the operating system.
 | |
| 
 | |
| This function does nothing if the terminal is not an asynchronous serial
 | |
| data port.
 | |
| 
 | |
| The return value is normally zero.  In the event of an error, a value
 | |
| of @math{-1} is returned.  The following @code{errno} error conditions
 | |
| are defined for this function:
 | |
| 
 | |
| @table @code
 | |
| @item EBADF
 | |
| The @var{filedes} is not a valid file descriptor.
 | |
| 
 | |
| @item ENOTTY
 | |
| The @var{filedes} is not associated with a terminal device.
 | |
| @end table
 | |
| @end deftypefun
 | |
| 
 | |
| 
 | |
| @cindex flushing terminal output queue
 | |
| @cindex terminal output queue, flushing
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypefun int tcdrain (int @var{filedes})
 | |
| The @code{tcdrain} function waits until all queued
 | |
| output to the terminal @var{filedes} has been transmitted.
 | |
| 
 | |
| This function is a cancelation point in multi-threaded programs.  This
 | |
| is a problem if the thread allocates some resources (like memory, file
 | |
| descriptors, semaphores or whatever) at the time @code{tcdrain} is
 | |
| called.  If the thread gets canceled these resources stay allocated
 | |
| until the program ends.  To avoid this calls to @code{tcdrain} should be
 | |
| protected using cancelation handlers.
 | |
| @c ref pthread_cleanup_push / pthread_cleanup_pop
 | |
| 
 | |
| The return value is normally zero.  In the event of an error, a value
 | |
| of @math{-1} is returned.  The following @code{errno} error conditions
 | |
| are defined for this function:
 | |
| 
 | |
| @table @code
 | |
| @item EBADF
 | |
| The @var{filedes} is not a valid file descriptor.
 | |
| 
 | |
| @item ENOTTY
 | |
| The @var{filedes} is not associated with a terminal device.
 | |
| 
 | |
| @item EINTR
 | |
| The operation was interrupted by delivery of a signal.
 | |
| @xref{Interrupted Primitives}.
 | |
| @end table
 | |
| @end deftypefun
 | |
| 
 | |
| 
 | |
| @cindex clearing terminal input queue
 | |
| @cindex terminal input queue, clearing
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypefun int tcflush (int @var{filedes}, int @var{queue})
 | |
| The @code{tcflush} function is used to clear the input and/or output
 | |
| queues associated with the terminal file @var{filedes}.  The @var{queue}
 | |
| argument specifies which queue(s) to clear, and can be one of the
 | |
| following values:
 | |
| 
 | |
| @c Extra blank lines here make it look better.
 | |
| @table @code
 | |
| @vindex TCIFLUSH
 | |
| @item TCIFLUSH
 | |
| 
 | |
| Clear any input data received, but not yet read.
 | |
| 
 | |
| @vindex TCOFLUSH
 | |
| @item TCOFLUSH
 | |
| 
 | |
| Clear any output data written, but not yet transmitted.
 | |
| 
 | |
| @vindex TCIOFLUSH
 | |
| @item TCIOFLUSH
 | |
| 
 | |
| Clear both queued input and output.
 | |
| @end table
 | |
| 
 | |
| The return value is normally zero.  In the event of an error, a value
 | |
| of @math{-1} is returned.  The following @code{errno} error conditions
 | |
| are defined for this function:
 | |
| 
 | |
| @table @code
 | |
| @item EBADF
 | |
| The @var{filedes} is not a valid file descriptor.
 | |
| 
 | |
| @item ENOTTY
 | |
| The @var{filedes} is not associated with a terminal device.
 | |
| 
 | |
| @item EINVAL
 | |
| A bad value was supplied as the @var{queue} argument.
 | |
| @end table
 | |
| 
 | |
| It is unfortunate that this function is named @code{tcflush}, because
 | |
| the term ``flush'' is normally used for quite another operation---waiting
 | |
| until all output is transmitted---and using it for discarding input or
 | |
| output would be confusing.  Unfortunately, the name @code{tcflush} comes
 | |
| from POSIX and we cannot change it.
 | |
| @end deftypefun
 | |
| 
 | |
| @cindex flow control, terminal
 | |
| @cindex terminal flow control
 | |
| @comment termios.h
 | |
| @comment POSIX.1
 | |
| @deftypefun int tcflow (int @var{filedes}, int @var{action})
 | |
| The @code{tcflow} function is used to perform operations relating to
 | |
| XON/XOFF flow control on the terminal file specified by @var{filedes}.
 | |
| 
 | |
| The @var{action} argument specifies what operation to perform, and can
 | |
| be one of the following values:
 | |
| 
 | |
| @table @code
 | |
| @vindex TCOOFF
 | |
| @item TCOOFF
 | |
| Suspend transmission of output.
 | |
| 
 | |
| @vindex TCOON
 | |
| @item TCOON
 | |
| Restart transmission of output.
 | |
| 
 | |
| @vindex TCIOFF
 | |
| @item TCIOFF
 | |
| Transmit a STOP character.
 | |
| 
 | |
| @vindex TCION
 | |
| @item TCION
 | |
| Transmit a START character.
 | |
| @end table
 | |
| 
 | |
| For more information about the STOP and START characters, see @ref{Special
 | |
| Characters}.
 | |
| 
 | |
| The return value is normally zero.  In the event of an error, a value
 | |
| of @math{-1} is returned.  The following @code{errno} error conditions
 | |
| are defined for this function:
 | |
| 
 | |
| @table @code
 | |
| @vindex EBADF
 | |
| @item EBADF
 | |
| The @var{filedes} is not a valid file descriptor.
 | |
| 
 | |
| @vindex ENOTTY
 | |
| @item ENOTTY
 | |
| The @var{filedes} is not associated with a terminal device.
 | |
| 
 | |
| @vindex EINVAL
 | |
| @item EINVAL
 | |
| A bad value was supplied as the @var{action} argument.
 | |
| @end table
 | |
| @end deftypefun
 | |
| 
 | |
| @node Noncanon Example
 | |
| @section Noncanonical Mode Example
 | |
| 
 | |
| Here is an example program that shows how you can set up a terminal
 | |
| device to read single characters in noncanonical input mode, without
 | |
| echo.
 | |
| 
 | |
| @smallexample
 | |
| @include termios.c.texi
 | |
| @end smallexample
 | |
| 
 | |
| This program is careful to restore the original terminal modes before
 | |
| exiting or terminating with a signal.  It uses the @code{atexit}
 | |
| function (@pxref{Cleanups on Exit}) to make sure this is done
 | |
| by @code{exit}.
 | |
| 
 | |
| @ignore
 | |
| @c !!!! the example doesn't handle any signals!
 | |
| The signals handled in the example are the ones that typically occur due
 | |
| to actions of the user.  It might be desirable to handle other signals
 | |
| such as SIGSEGV that can result from bugs in the program.
 | |
| @end ignore
 | |
| 
 | |
| The shell is supposed to take care of resetting the terminal modes when
 | |
| a process is stopped or continued; see @ref{Job Control}.  But some
 | |
| existing shells do not actually do this, so you may wish to establish
 | |
| handlers for job control signals that reset terminal modes.  The above
 | |
| example does so.
 | |
| 
 | |
| 
 | |
| @node Pseudo-Terminals
 | |
| @section Pseudo-Terminals
 | |
| @cindex pseudo-terminals
 | |
| 
 | |
| A @dfn{pseudo-terminal} is a special interprocess communication channel
 | |
| that acts like a terminal.  One end of the channel is called the
 | |
| @dfn{master} side or @dfn{master pseudo-terminal device}, the other side
 | |
| is called the @dfn{slave} side.  Data written to the master side is
 | |
| received by the slave side as if it was the result of a user typing at
 | |
| an ordinary terminal, and data written to the slave side is sent to the
 | |
| master side as if it was written on an ordinary terminal.
 | |
| 
 | |
| Pseudo terminals are the way programs like @code{xterm} and @code{emacs}
 | |
| implement their terminal emulation functionality.
 | |
| 
 | |
| @menu
 | |
| * Allocation::             Allocating a pseudo terminal.
 | |
| * Pseudo-Terminal Pairs::  How to open both sides of a
 | |
|                             pseudo-terminal in a single operation.
 | |
| @end menu
 | |
| 
 | |
| @node Allocation
 | |
| @subsection Allocating Pseudo-Terminals
 | |
| @cindex allocating pseudo-terminals
 | |
| 
 | |
| @pindex stdlib.h
 | |
| This subsection describes functions for allocating a pseudo-terminal,
 | |
| and for making this pseudo-terminal available for actual use.  These
 | |
| functions are declared in the header file @file{stdlib.h}.
 | |
| 
 | |
| @comment stdlib.h
 | |
| @comment GNU
 | |
| @deftypefun int getpt (void)
 | |
| The @code{getpt} function returns a new file descriptor for the next
 | |
| available master pseudo-terminal.  The normal return value from
 | |
| @code{getpt} is a non-negative integer file descriptor.  In the case of
 | |
| an error, a value of @math{-1} is returned instead.  The following
 | |
| @code{errno} conditions are defined for this function:
 | |
| 
 | |
| @table @code
 | |
| @item ENOENT
 | |
| There are no free master pseudo-terminals available.
 | |
| @end table
 | |
| 
 | |
| This function is a GNU extension.
 | |
| @end deftypefun
 | |
| 
 | |
| @comment stdlib.h
 | |
| @comment SVID, XPG4.2
 | |
| @deftypefun int grantpt (int @var{filedes})
 | |
| The @code{grantpt} function changes the ownership and access permission
 | |
| of the slave pseudo-terminal device corresponding to the master
 | |
| pseudo-terminal device associated with the file descriptor
 | |
| @var{filedes}.  The owner is set from the real user ID of the calling
 | |
| process (@pxref{Process Persona}), and the group is set to a special
 | |
| group (typically @dfn{tty}) or from the real group ID of the calling
 | |
| process.  The access permission is set such that the file is both
 | |
| readable and writable by the owner and only writable by the group.
 | |
| 
 | |
| On some systems this function is implemented by invoking a special
 | |
| @code{setuid} root program (@pxref{How Change Persona}).  As a
 | |
| consequence, installing a signal handler for the @code{SIGCHLD} signal
 | |
| (@pxref{Job Control Signals}) may interfere with a call to
 | |
| @code{grantpt}.
 | |
| 
 | |
| The normal return value from @code{grantpt} is @math{0}; a value of
 | |
| @math{-1} is returned in case of failure.  The following @code{errno}
 | |
| error conditions are defined for this function:
 | |
| 
 | |
| @table @code
 | |
| @item EBADF
 | |
| The @var{filedes} argument is not a valid file descriptor.
 | |
| 
 | |
| @item ENINVAL
 | |
| The @var{filedes} argument is not associated with a master pseudo-terminal
 | |
| device.
 | |
| 
 | |
| @item EACCESS
 | |
| The slave pseudo-terminal device corresponding to the master associated
 | |
| with @var{filedes} could not be accessed.
 | |
| @end table
 | |
| 
 | |
| @end deftypefun
 | |
| 
 | |
| @comment stdlib.h
 | |
| @comment SVID, XPG4.2
 | |
| @deftypefun int unlockpt (int @var{filedes})
 | |
| The @code{unlockpt} function unlocks the slave pseudo-terminal device
 | |
| corresponding to the master pseudo-terminal device associated with the
 | |
| file descriptor @var{filedes}.  On many systems, the slave can only be
 | |
| opened after unlocking, so portable applications should always call
 | |
| @code{unlockpt} before trying to open the slave.
 | |
| 
 | |
| The normal return value from @code{unlockpt} is @math{0}; a value of
 | |
| @math{-1} is returned in case of failure.  The following @code{errno}
 | |
| error conditions are defined for this function:
 | |
| 
 | |
| @table @code
 | |
| @item EBADF
 | |
| The @var{filedes} argument is not a valid file descriptor.
 | |
| 
 | |
| @item EINVAL
 | |
| The @var{filedes} argument is not associated with a master pseudo-terminal
 | |
| device.
 | |
| @end table
 | |
| @end deftypefun
 | |
| 
 | |
| @comment stdlib.h
 | |
| @comment SVID, XPG4.2
 | |
| @deftypefun {char *} ptsname (int @var{filedes})
 | |
| If the file descriptor @var{filedes} is associated with a
 | |
| master pseudo-terminal device, the @code{ptsname} function returns a
 | |
| pointer to a statically-allocated, null-terminated string containing the
 | |
| file name of the associated slave pseudo-terminal file.  This string
 | |
| might be overwritten by subsequent calls to @code{ptsname}.
 | |
| @end deftypefun
 | |
| 
 | |
| @comment stdlib.h
 | |
| @comment GNU
 | |
| @deftypefun int ptsname_r (int @var{filedes}, char *@var{buf}, size_t @var{len})
 | |
| The @code{ptsname_r} function is similar to the @code{ptsname} function
 | |
| except that it places its result into the user-specified buffer starting
 | |
| at @var{buf} with length @var{len}.
 | |
| 
 | |
| This function is a GNU extension.
 | |
| @end deftypefun
 | |
| 
 | |
| @strong{Portability Note:} On @w{System V} derived systems, the file
 | |
| returned by the @code{ptsname} and @code{ptsname_r} functions may be
 | |
| STREAMS-based, and therefore require additional processing after opening
 | |
| before it actually behaves as a pseudo terminal.
 | |
| @c FIXME: xref STREAMS
 | |
| 
 | |
| Typical usage of these functions is illustrated by the following example:
 | |
| @smallexample
 | |
| int
 | |
| open_pty_pair (int *amaster, int *aslave)
 | |
| @{
 | |
|   int master, slave;
 | |
|   char *name
 | |
| 
 | |
|   master = getpt ();
 | |
|   if (master < 0)
 | |
|     return 0;
 | |
| 
 | |
|   if (grantpt (master) < 0 || unlockpt (master) < 0)
 | |
|     goto close_master;
 | |
|   name = ptsname (master);
 | |
|   if (name == NULL)
 | |
|     goto close_master;
 | |
| 
 | |
|   slave = open (name, O_RDWR);
 | |
|   if (slave == -1)
 | |
|     goto close_master;
 | |
| 
 | |
|   if (isastream (slave))
 | |
|     @{
 | |
|       if (ioctl (slave, I_PUSH, "ptem") < 0
 | |
|           || ioctl (slave, I_PUSH, "ldterm") < 0)
 | |
|         goto close_slave;
 | |
|     @}
 | |
| 
 | |
|   *amaster = master;
 | |
|   *aslave = slave;
 | |
|   return 1;
 | |
| 
 | |
| close_slave:
 | |
|   close (slave);
 | |
| 
 | |
| close_master:
 | |
|   close (master);
 | |
|   return 0;
 | |
| @}
 | |
| @end smallexample
 | |
| 
 | |
| @node Pseudo-Terminal Pairs
 | |
| @subsection Opening a Pseudo-Terminal Pair
 | |
| @cindex opening a pseudo-terminal pair
 | |
| 
 | |
| These functions, derived from BSD, are available in the separate
 | |
| @file{libutil} library, and declared in @file{pty.h}.
 | |
| 
 | |
| @comment pty.h
 | |
| @comment BSD
 | |
| @deftypefun int openpty (int *@var{amaster}, int *@var{aslave}, char *@var{name}, struct termios *@var{termp}, struct winsize *@var{winp})
 | |
| This function allocates and opens a pseudo-terminal pair, returning the
 | |
| file descriptor for the master in @var{*amaster}, and the file
 | |
| descriptor for the slave in @var{*aslave}.  If the argument @var{name}
 | |
| is not a null pointer, the file name of the slave pseudo-terminal
 | |
| device is stored in @code{*name}.  If @var{termp} is not a null pointer,
 | |
| the terminal attributes of the slave are set to the ones specified in
 | |
| the structure that @var{termp} points to (@pxref{Terminal Modes}).
 | |
| Likewise, if the @var{winp} is not a null pointer, the screen size of
 | |
| the slave is set to the values specified in the structure that
 | |
| @var{winp} points to.
 | |
| 
 | |
| The normal return value from @code{openpty} is @math{0}; a value of
 | |
| @math{-1} is returned in case of failure.  The following @code{errno}
 | |
| conditions are defined for this function:
 | |
| 
 | |
| @table @code
 | |
| @item ENOENT
 | |
| There are no free pseudo-terminal pairs available.
 | |
| @end table
 | |
| 
 | |
| @strong{Warning:} Using the @code{openpty} function with @var{name} not
 | |
| set to @code{NULL} is @strong{very dangerous} because it provides no
 | |
| protection against overflowing the string @var{name}.  You should use
 | |
| the @code{ttyname} function on the file descriptor returned in
 | |
| @var{*slave} to find out the file name of the slave pseudo-terminal
 | |
| device instead.
 | |
| @end deftypefun
 | |
| 
 | |
| @comment pty.h
 | |
| @comment BSD
 | |
| @deftypefun int forkpty (int *@var{amaster}, char *@var{name}, struct termios *@var{termp}, struct winsize *@var{winp})
 | |
| This function is similar to the @code{openpty} function, but in
 | |
| addition, forks a new process (@pxref{Creating a Process}) and makes the
 | |
| newly opened slave pseudo-terminal device the controlling terminal
 | |
| (@pxref{Controlling Terminal}) for the child process.
 | |
| 
 | |
| If the operation is successful, there are then both parent and child
 | |
| processes and both see @code{forkpty} return, but with different values:
 | |
| it returns a value of @math{0} in the child process and returns the child's
 | |
| process ID in the parent process.
 | |
| 
 | |
| If the allocation of a pseudo-terminal pair or the process creation
 | |
| failed, @code{forkpty} returns a value of @math{-1} in the parent
 | |
| process.
 | |
| 
 | |
| @strong{Warning:} The @code{forkpty} function has the same problems with
 | |
| respect to the @var{name} argument as @code{openpty}.
 | |
| @end deftypefun
 |