<html lang="en">
<head>
<title>Noncanon Example - The GNU C Library</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="The GNU C Library">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="Low_002dLevel-Terminal-Interface.html#Low_002dLevel-Terminal-Interface" title="Low-Level Terminal Interface">
<link rel="prev" href="Line-Control.html#Line-Control" title="Line Control">
<link rel="next" href="Pseudo_002dTerminals.html#Pseudo_002dTerminals" title="Pseudo-Terminals">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU C library.

This is Edition 0.12, last updated 2007-10-27,
of `The GNU C Library Reference Manual', for version
2.8 (Sourcery G++ Lite 2011.03-41).

Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
2003, 2007, 2008, 2010 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software Needs Free Documentation''
and ``GNU Lesser General Public License'', the Front-Cover texts being
``A GNU Manual'', and with the Back-Cover Texts as in (a) below.  A
copy of the license is included in the section entitled "GNU Free
Documentation License".

(a) The FSF's Back-Cover Text is: ``You have the freedom to
copy and modify this GNU manual.  Buying copies from the FSF
supports it in developing GNU and promoting software freedom.''-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
  pre.display { font-family:inherit }
  pre.format  { font-family:inherit }
  pre.smalldisplay { font-family:inherit; font-size:smaller }
  pre.smallformat  { font-family:inherit; font-size:smaller }
  pre.smallexample { font-size:smaller }
  pre.smalllisp    { font-size:smaller }
  span.sc    { font-variant:small-caps }
  span.roman { font-family:serif; font-weight:normal; } 
  span.sansserif { font-family:sans-serif; font-weight:normal; } 
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Noncanon-Example"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Pseudo_002dTerminals.html#Pseudo_002dTerminals">Pseudo-Terminals</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Line-Control.html#Line-Control">Line Control</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Low_002dLevel-Terminal-Interface.html#Low_002dLevel-Terminal-Interface">Low-Level Terminal Interface</a>
<hr>
</div>

<h3 class="section">17.7 Noncanonical Mode Example</h3>

<p>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.

<pre class="smallexample">     #include &lt;unistd.h&gt;
     #include &lt;stdio.h&gt;
     #include &lt;stdlib.h&gt;
     #include &lt;termios.h&gt;
     
     /* <span class="roman">Use this variable to remember original terminal attributes.</span> */
     
     struct termios saved_attributes;
     
     void
     reset_input_mode (void)
     {
       tcsetattr (STDIN_FILENO, TCSANOW, &amp;saved_attributes);
     }
     
     void
     set_input_mode (void)
     {
       struct termios tattr;
       char *name;
     
       /* <span class="roman">Make sure stdin is a terminal.</span> */
       if (!isatty (STDIN_FILENO))
         {
           fprintf (stderr, "Not a terminal.\n");
           exit (EXIT_FAILURE);
         }
     
       /* <span class="roman">Save the terminal attributes so we can restore them later.</span> */
       tcgetattr (STDIN_FILENO, &amp;saved_attributes);
       atexit (reset_input_mode);
     
       /* <span class="roman">Set the funny terminal modes.</span> */
       tcgetattr (STDIN_FILENO, &amp;tattr);
       tattr.c_lflag &amp;= ~(ICANON|ECHO); /* <span class="roman">Clear ICANON and ECHO.</span> */
       tattr.c_cc[VMIN] = 1;
       tattr.c_cc[VTIME] = 0;
       tcsetattr (STDIN_FILENO, TCSAFLUSH, &amp;tattr);
     }
     
     int
     main (void)
     {
       char c;
     
       set_input_mode ();
     
       while (1)
         {
           read (STDIN_FILENO, &amp;c, 1);
           if (c == '\004')          /* <kbd>C-d</kbd> */
             break;
           else
             putchar (c);
         }
     
       return EXIT_SUCCESS;
     }
</pre>
   <p>This program is careful to restore the original terminal modes before
exiting or terminating with a signal.  It uses the <code>atexit</code>
function (see <a href="Cleanups-on-Exit.html#Cleanups-on-Exit">Cleanups on Exit</a>) to make sure this is done
by <code>exit</code>.

   <p>The shell is supposed to take care of resetting the terminal modes when
a process is stopped or continued; see <a href="Job-Control.html#Job-Control">Job Control</a>.  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.

   </body></html>

