| @node Low-Level Terminal Interface, Syslog, 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. Posix. |
| * BSD Terminal Modes:: BSD compatible terminal mode setting |
| * 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}) |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| @c isatty ok |
| @c tcgetattr dup ok |
| 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}) |
| @safety{@prelim{}@mtunsafe{@mtasurace{:ttyname}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsfd{} @acsmem{}}} |
| @c ttyname @mtasurace:ttyname @ascuheap @asulock @aculock @acsmem @acsfd |
| @c isatty dup ok |
| @c fstat dup ok |
| @c memcpy dup ok |
| @c getttyname @mtasurace:ttyname @ascuheap @asulock @aculock @acsmem @acsfd |
| @c opendir @ascuheap @acsmem @acsfd |
| @c readdir ok [protected by exclusive access] |
| @c strcmp dup ok |
| @c free dup @asulock @aculock @acsfd @acsmem |
| @c malloc dup @asulock @aculock @acsfd @acsmem |
| @c closedir @ascuheap @acsmem @acsfd |
| @c mempcpy dup ok |
| @c stat dup ok |
| 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}) |
| @safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{} @acsfd{}}} |
| @c ttyname_r @ascuheap @acsmem @acsfd |
| @c isatty dup ok |
| @c fstat dup ok |
| @c memcpy dup ok |
| @c getttyname_r @ascuheap @acsmem @acsfd |
| @c opendir @ascuheap @acsmem @acsfd |
| @c readdir ok [protected by exclusive access] |
| @c strcmp dup ok |
| @c closedir @ascuheap @acsmem @acsfd |
| @c stpncpy dup ok |
| @c stat dup ok |
| 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}. |
| |
| Don't confuse terminal attributes with file attributes. A device special |
| file which is associated with a terminal has file attributes as described |
| in @ref{File Attributes}. These are unrelated to the attributes of the |
| terminal device itself, which are discussed in this section. |
| |
| @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}) |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| @c Converting the kernel-returned termios data structure to the userland |
| @c format does not ensure atomic or consistent writing. |
| 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}) |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| @c Converting the incoming termios data structure to the kernel format |
| @c does not ensure atomic or consistent reading. |
| 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 @gnuhurdsystems{}. |
| |
| 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 tcsetattr"); |
| return 0; |
| @} |
| 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 |
| @gnulinuxhurdsystems{}. |
| @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 effective only if @code{OPOST} is set. |
| |
| @comment termios.h |
| @comment POSIX.1 |
| @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 (optional) |
| @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. This bit |
| exists only on BSD systems and @gnuhurdsystems{}; on |
| @gnulinuxsystems{} it is available as @code{XTABS}. |
| @end deftypevr |
| |
| @comment termios.h (optional) |
| @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. |
| This bit exists only on BSD systems and @gnuhurdsystems{}. |
| @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; these exist only on BSD |
| systems and @gnuhurdsystems{}. |
| |
| @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 |
| @gnulinuxhurdsystems{}. |
| @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 |
| @gnulinuxhurdsystems{}. |
| @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 |
| @gnulinuxhurdsystems{}. |
| @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 @gnulinuxhurdsystems{}, 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 on BSD systems |
| and @gnuhurdsystems{}. |
| |
| @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 (optional) |
| @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}) |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| @c Direct access to a single termios field, except on Linux, where |
| @c multiple accesses may take place. No worries either way, callers |
| @c must ensure mutual exclusion on such non-opaque types. |
| 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}) |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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}) |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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}) |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| 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}) |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| @c There's no guarantee that the two calls are atomic, but since this is |
| @c not an opaque type, callers ought to ensure mutual exclusion to the |
| @c termios object. |
| |
| @c cfsetspeed ok |
| @c cfsetispeed ok |
| @c cfsetospeed ok |
| 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 @theglibc{}, 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 @gnulinuxhurdsystems{}. |
| @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 @gnuhurdsystems{}). |
| |
| @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 |
| |
| @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}. |
| |
| This character is available on BSD systems and @gnulinuxhurdsystems{}. |
| @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. |
| |
| This character is available on BSD systems and @gnulinuxhurdsystems{}. |
| @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. |
| |
| This character is available only on BSD systems and @gnuhurdsystems{}. |
| @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. @Theglibc{} allocates separate slots for these |
| uses. |
| |
| @comment termios.h |
| @comment BSD |
| @deftypefun void cfmakeraw (struct termios *@var{termios-p}) |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| @c There's no guarantee the changes are atomic, but since this is not an |
| @c opaque type, callers ought to ensure mutual exclusion to the termios |
| @c object. |
| 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 BSD Terminal Modes |
| @section BSD Terminal Modes |
| @cindex terminal modes, BSD |
| |
| The usual way to get and set terminal modes is with the functions described |
| in @ref{Terminal Modes}. However, on some systems you can use the |
| BSD-derived functions in this section to do some of the same thing. On |
| many systems, these functions do not exist. Even with @theglibc{}, |
| the functions simply fail with @code{errno} = @code{ENOSYS} with many |
| kernels, including Linux. |
| |
| The symbols used in this section are declared in @file{sgtty.h}. |
| |
| @comment termios.h |
| @comment BSD |
| @deftp {Data Type} {struct sgttyb} |
| This structure is an input or output parameter list for @code{gtty} and |
| @code{stty}. |
| |
| @table @code |
| @item char sg_ispeed |
| Line speed for input |
| @item char sg_ospeed |
| Line speed for output |
| @item char sg_erase |
| Erase character |
| @item char sg_kill |
| Kill character |
| @item int sg_flags |
| Various flags |
| @end table |
| @end deftp |
| |
| @comment sgtty.h |
| @comment BSD |
| @deftypefun int gtty (int @var{filedes}, struct sgttyb *@var{attributes}) |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| @c Direct ioctl, BSD only. |
| This function gets the attributes of a terminal. |
| |
| @code{gtty} sets *@var{attributes} to describe the terminal attributes |
| of the terminal which is open with file descriptor @var{filedes}. |
| @end deftypefun |
| |
| @comment sgtty.h |
| @comment BSD |
| @deftypefun int stty (int @var{filedes}, const struct sgttyb *@var{attributes}) |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| @c Direct ioctl, BSD only. |
| |
| This function sets the attributes of a terminal. |
| |
| @code{stty} sets the terminal attributes of the terminal which is open with |
| file descriptor @var{filedes} to those described by *@var{filedes}. |
| @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}) |
| @safety{@prelim{}@mtunsafe{@mtasurace{:tcattr(filedes)/bsd}}@asunsafe{}@acunsafe{@acucorrupt{/bsd}}} |
| @c On Linux, this calls just one out of two ioctls; on BSD, it's two |
| @c ioctls with a select (for the delay only) in between, the first |
| @c setting and the latter clearing the break status. The BSD |
| @c implementation may leave the break enabled if cancelled, and threads |
| @c and signals may cause the break to be interrupted before requested. |
| 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}) |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| @c Direct ioctl. |
| The @code{tcdrain} function waits until all queued |
| output to the terminal @var{filedes} has been transmitted. |
| |
| This function is a cancellation 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 cancellation 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}) |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} |
| @c Direct ioctl. |
| 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}) |
| @safety{@prelim{}@mtunsafe{@mtasurace{:tcattr(filedes)/bsd}}@asunsafe{}@acsafe{}} |
| @c Direct ioctl on Linux. On BSD, the TCO* actions are a single ioctl, |
| @c whereas the TCI actions first call tcgetattr and then write to the fd |
| @c the c_cc character corresponding to the action; there's a window for |
| @c another thread to change the xon/xoff characters. |
| 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) |
| @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}} |
| @c On BSD, tries to open multiple potential pty names, returning on the |
| @c first success. On Linux, try posix_openpt first, then fallback to |
| @c the BSD implementation. The posix implementation opens the ptmx |
| @c device, checks with statfs that /dev/pts is a devpts or that /dev is |
| @c a devfs, and returns the fd; static variables devpts_mounted and |
| @c have_no_dev_ptmx are safely initialized so as to avoid repeated |
| @c tests. |
| 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}) |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} |
| @c grantpt @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem |
| @c unix/grantpt:pts_name @acsuheap @acsmem |
| @c ptsname_internal dup ok (but this is Linux-only!) |
| @c memchr dup ok |
| @c realloc dup @acsuheap @acsmem |
| @c malloc dup @acsuheap @acsmem |
| @c free dup @acsuheap @acsmem |
| @c fcntl dup ok |
| @c getuid dup ok |
| @c chown dup ok |
| @c sysconf(_SC_GETGR_R_SIZE_MAX) ok |
| @c getgrnam_r @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem |
| @c getgid dup ok |
| @c chmod dup ok |
| @c fork dup @aculock |
| @c [child] |
| @c setrlimit |
| @c dup2 |
| @c CLOSE_ALL_FDS |
| @c execle |
| @c _exit |
| @c waitpid dup ok |
| @c WIFEXITED dup ok |
| @c WEXITSTATUS dup ok |
| @c free dup @ascuheap @acsmem |
| 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 EINVAL |
| The @var{filedes} argument is not associated with a master pseudo-terminal |
| device. |
| |
| @item EACCES |
| 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}) |
| @safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{/bsd}}@acunsafe{@acsmem{} @acsfd{}}} |
| @c unlockpt @ascuheap/bsd @acsmem @acsfd |
| @c /bsd |
| @c ptsname_r dup @ascuheap @acsmem @acsfd |
| @c revoke ok (syscall) |
| @c /linux |
| @c ioctl dup ok |
| 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}) |
| @safety{@prelim{}@mtunsafe{@mtasurace{:ptsname}}@asunsafe{@ascuheap{/bsd}}@acunsafe{@acsmem{} @acsfd{}}} |
| @c ptsname @mtasurace:ptsname @ascuheap/bsd @acsmem @acsfd |
| @c ptsname_r dup @ascuheap/bsd @acsmem @acsfd |
| 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}) |
| @safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{/bsd}}@acunsafe{@acsmem{} @acsfd{}}} |
| @c ptsname_r @ascuheap/bsd @acsmem @acsfd |
| @c /hurd |
| @c term_get_peername ok |
| @c strlen dup ok |
| @c memcpy dup ok |
| @c /bsd |
| @c isatty dup ok |
| @c strlen dup ok |
| @c ttyname_r dup @ascuheap @acsmem @acsfd |
| @c stat dup ok |
| @c /linux |
| @c ptsname_internal ok |
| @c isatty dup ok |
| @c ioctl dup ok |
| @c strlen dup ok |
| @c itoa_word dup ok |
| @c stpcpy dup ok |
| @c memcpy dup ok |
| @c fxstat64 dup ok |
| @c MASTER_P ok |
| @c major ok |
| @c gnu_dev_major ok |
| @c minor ok |
| @c gnu_dev_minor ok |
| @c minor dup ok |
| @c xstat64 dup ok |
| @c S_ISCHR dup ok |
| @c SLAVE_P ok |
| @c major dup ok |
| @c minor dup ok |
| 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}, const struct termios *@var{termp}, const struct winsize *@var{winp}) |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} |
| @c openpty @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem |
| @c getpt @acsfd |
| @c grantpt @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem |
| @c unlockpt dup @ascuheap/bsd @acsmem @acsfd |
| @c openpty:pts_name @acsuheap @acsmem @acsfd |
| @c ptsname_r dup @ascuheap/bsd @acsmem @acsfd |
| @c realloc dup @acsuheap @acsmem |
| @c malloc dup @acsuheap @acsmem |
| @c free dup @acsuheap @acsmem |
| @c open dup @acsfd |
| @c free dup @acsuheap @acsmem |
| @c tcsetattr dup ok |
| @c ioctl dup ok |
| @c strcpy dup ok |
| @c close dup @acsfd |
| 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}, const struct termios *@var{termp}, const struct winsize *@var{winp}) |
| @safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascudlopen{} @ascuplugin{} @ascuheap{} @asulock{}}@acunsafe{@acucorrupt{} @aculock{} @acsfd{} @acsmem{}}} |
| @c forkpty @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem |
| @c openpty dup @mtslocale @ascudlopen @ascuplugin @ascuheap @asulock @acucorrupt @aculock @acsfd @acsmem |
| @c fork dup @aculock |
| @c close dup @acsfd |
| @c /child |
| @c close dup @acsfd |
| @c login_tty dup @mtasurace:ttyname @ascuheap @asulock @aculock @acsmem @acsfd |
| @c _exit dup ok |
| @c close dup @acsfd |
| 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 |