| 
 |  | 
In canonical mode, characters are read from the device and processed before being returned. This processing translates kill and erase characters. Characters are not returned until a new line (NL), end of file (EOF), or end of line (EOL) is read, which means that characters are returned a line at a time. Canonical mode is usually associated with terminals.
An important factor to consider when using canonical mode is what to do when reading from a TTY device for which characters are not available. If the O_NDELAY flag has been set for the TTY, then such reads return a 0, indicating that no characters are available. Otherwise, reads will not return until a character is available. If a program can perform other processing when characters are not available from a TTY, then the O_NDELAY flag should be set for the TTY. This might require programs to be more complicated, but the complication are offset by an increase in efficiency.
The following function opens a TTY device for reading or writing (line 12), places it in canonical mode (line 23), and sets the O_NDELAY option so that reads are not blocked when characters are not available (line 12).
 1  #include <fcntl.h>
 2  #include <termio.h>
 3
 4  extern struct termio old_term;
 5
 6  setup1(TTY)
 7  char *TTY;
 8  {
 9        int fid;
10        struct termio new_term;
11
12        if ((fid = open(TTY, O_RDWR|O_NDELAY)) == -1)
13        {
14                printf("open failed.\n");
15                exit(1);
16        }
17                else if (ioctl(fid, TCGETA, &old_term) == -1)
18                     {
19                        printf("ioctl get failed.\n");
20                        exit(1);
21                     }
22        new_term = old_term;
23        new_term.c_lflag |= ICANON;
24        if (ioctl(fid, TCSETA, &new_term) == -1)
25        {
26                printf("ioctl set failed.\n");
27                exit(1);
28        }
29        return fid;
30  }
Improving TTY performance - canonical mode