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