The keyboard is used to type data, and send certain control signals to the computer. UNIX system software performs terminal emulation on the console screen and keyboard, and, in doing so, makes use of several particular keys and key combinations. These keys and key combinations have special names that are unique to the UNIX system, and may or may not correspond to the keytop labels on your keyboard.
When you press a key, one of the following happens:
When a key is pressed (a keystroke), the keyboard sends a scancode to the computer. This scancode is interpreted by the keyboard driver. The actual code sequence delivered to the terminal input routine (see termio (7)) is defined by a set of internal tables in the driver. These tables can be modified by software (see the discussion of ioctl calls below). In addition, the driver can be instructed not to do translations, delivering the keyboard up and down scan codes directly.
The default screen switch enable sequence <Ctrl><Alt> is
configurable.
The SYSREQ table entry (see the ``Keyboard map'' section) can be changed using ioctl calls (see the section ``ioctl calls'').
If the screen switch enable sequence is changed from the default, you
must use the newly set sequence to switch virtual terminals.
The default keyboard mapping can be restored using the
mapkey(1M)
command.
Name | Keytop | Action |
---|---|---|
INTR | <Del> | Stops current action and returns to the shell. This key is also called the RUB OUT or INTERRUPT key. |
BACKSPACE |
Deletes the first character to the left of the
cursor.
Note that the ``cursor left'' key also has a left arrow () on its keytop, but you cannot backspace using that key. | |
<Ctrl>-d | <Ctrl>-D | Signals the end of input from the keyboard; also exits current shell. |
<Ctrl>-h | <Ctrl>-H | Deletes the first character to the left of the cursor. Also called the ERASE key. |
<Ctrl>-q | <Ctrl>-Q | Restarts printing after it has been stopped with <Ctrl>-s. |
<Ctrl>-s | <Ctrl>-S | Suspends printing on the screen (does not stop the program). |
<Ctrl>-u | <Ctrl>-U | Deletes all characters on the current line. Also called the KILL key. |
<Ctrl>-e | <Ctrl>-E | Quits current command and creates a core |
file, if allowed. (Recommended for debugging only.) | ||
ESCAPE | <Esc> | Special code for some programs. For example, changes from insert mode to command mode in the vi(1) text editor. |
<Return> |
[Enter] (down-left
arrow) or <Enter> | Terminates a command line and initiates an action from the shell. |
Fn | <Fn> |
Function key n.
<F1>-<F12> are unshifted,
<F13>-<F24> are shifted <F1>-<F12>,
<F25>-<F36> are <Ctrl>-<F1> <F1>-<F12>
and
<F37>-<F48> are <Ctrl>-<Shift>-<Shift> <F1>-<F12>.
The next Fn keys (<F49>-<F60>) are on the number pad (unshifted): <F49> ``7'' <F50> ``8'' <F51> ``9'' <F52> ``-'' <F53> ``4'' <F54> ``5'' <F55> ``6'' <F56> ``+'' <F57> ``1'' <F58> ``2'' <F59> ``3'' <F60> ``0'' |
The two remaining states are indicated by two special bytes. The first byte is a special state byte whose bits indicate whether the key is special in one or more of the first eight states. The second byte is one of four codes represented by the characters ``C'', ``N'', ``B'', or ``O'' which indicate how the lock keys affect the particular key.
The following table describes the default keyboard mapping. All values, except for special keywords (which are described later), are ASCII character values.
The remaining columns are the values of key presses when combinations of the <Ctrl>, <Alt>, and <Shift> keys are also held down.
Scan
code |
Base
|
<Shift>
|
<Ctrl>
|
<Ctrl>
<Shift> |
<Alt>
|
<Alt>
<Shift> |
<Alt>
<Ctrl> |
<Alt>
<Ctrl> <Shift> |
Lock
|
SRQTAB
|
---|---|---|---|---|---|---|---|---|---|---|
1 | esc | esc | esc | esc | esc | esc | esc | esc | O | nop |
2 | '1' | '!' | '1' | '1' | escn | escn | nop | nop | O | nop |
3 | '2' | '@' | '2' | nul | escn | escn | nop | nop | O | nop |
4 | '3' | '#' | '3' | '3' | escn | escn | nop | nop | O | nop |
5 | '4' | '$' | '4' | '4' | escn | escn | nop | nop | O | nop |
6 | '5' | '%' | '5' | '5' | escn | escn | nop | nop | O | nop |
7 | '6' | '^' | '6' | rs | escn | escn | nop | nop | O | nop |
8 | '7' | '&' | '7' | '7' | escn | escn | nop | nop | O | nop |
9 | '8' | '*' | '8' | '8' | escn | escn | nop | nop | O | nop |
10 | '9' | '(' | '9' | '9' | escn | escn | nop | nop | O | nop |
11 | '0' | ')' | '0' | '0' | escn | escn | nop | nop | O | nop |
12 | '-' | '_' | '-' | ns | escn | escn | nop | nop | O | nop |
13 | '=' | '+' | '=' | '=' | escn | escn | nop | nop | O | nop |
14 | bs | bs | bs | bs | bs | bs | bs | bs | O | nop |
15 | ht | btab | ht | btab | ht | btab | ht | btab | O | nop |
16 | 'q' | 'Q' | dc1 | dc1 | escn | escn | nop | nop | C | nop |
17 | 'w' | 'W' | etb | etb | escn | escn | nop | nop | C | nop |
18 | 'e' | 'E' | enq | enq | escn | escn | nop | nop | C | nop |
19 | 'r' | 'R' | dc2 | dc2 | escn | escn | nop | nop | C | nop |
20 | 't' | 'T' | dc4 | dc4 | escn | escn | nop | nop | C | nop |
21 | 'y' | 'Y' | em | em | escn | escn | nop | nop | C | nop |
22 | 'u' | 'U' | nak | nak | escn | escn | nop | nop | C | nop |
23 | 'i' | 'I' | ht | ht | escn | escn | nop | nop | C | nop |
24 | 'o' | 'O' | si | si | escn | escn | nop | nop | C | nop |
25 | 'p' | 'P' | dle | dle | escn | escn | nop | nop | C | K_PREV |
26 | '[' | '{' | esc | nop | escn | escn | nop | nop | O | nop |
27 | ']' | '}' | gs | nop | escn | escn | nop | nop | O | nop |
28 | cr | cr | cr | cr | cr | cr | cr | cr | O | nop |
29 | lctrl | lctrl | lctrl | lctrl | lctrl | lctrl | lctrl | lctrl | O | nop |
30 | 'a' | 'A' | soh | soh | escn | escn | nop | nop | C | nop |
31 | 's' | 'S' | dc3 | dc3 | escn | escn | nop | nop | C | nop |
32 | 'd' | 'D' | eot | eot | escn | escn | k_dbg | nop | C | nop |
33 | 'f' | 'F' | ack | ack | escn | escn | nop | nop | C | K_FRCNEXT |
34 | 'g' | 'G' | bel | bel | escn | escn | nop | nop | C | nop |
35 | 'h' | 'H' | bs | bs | escn | escn | nop | nop | C | K_VTF |
36 | 'j' | 'J' | nl | nl | escn | escn | nop | nop | C | nop |
37 | 'k' | 'K' | vt | vt | escn | escn | nop | nop | C | nop |
38 | 'l' | 'L' | np | np | escn | escn | nop | nop | C | nop |
39 | ';' | ':' | ';' | ':' | escn | escn | nop | nop | O | nop |
40 | '´' | '"' | '´' | '"' | escn | escn | nop | nop | O | nop |
41 | '`' | '~' | '`' | '~' | escn | escn | nop | nop | O | nop |
42 | lshift | lshift | lshift | lshift | lshift | lshift | lshift | lshift | O | nop |
43 | '\\' | '|' | fs | '|' | escn | escn | nop | nop | O | nop |
44 | 'z' | 'Z' | sub | sub | escn | escn | nop | nop | C | nop |
45 | 'x' | 'X' | can | can | escn | escn | nop | nop | C | nop |
46 | 'c' | 'C' | etx | etx | escn | escn | nop | nop | C | nop |
47 | 'v' | 'V' | syn | syn | escn | escn | nop | nop | C | nop |
48 | 'b' | 'B' | stx | stx | escn | escn | nop | nop | C | nop |
49 | 'n' | 'N' | so | so | escn | escn | nop | nop | C | K_NEXT |
50 | 'm' | 'M' | cr | cr | escn | escn | nop | nop | C | nop |
51 | ',' | '<' | ',' | '<' | escn | escn | nop | nop | O | nop |
52 | '.' | '>' | '.' | '>' | escn | escn | nop | nop | O | nop |
53 | '/' | '?' | '/' | ns | escn | escn | nop | nop | O | nop |
54 | rshift | rshift | rshift | rshift | rshift | rshift | rshift | rshift | O | nop |
55 | '*' | '*' | '*' | '*' | escn | escn | nop | nop | O | nop |
56 | lalt | lalt | lalt | lalt | lalt | lalt | lalt | lalt | O | nop |
57 | ' ' | ' ' | nul | nul | escn | escn | nop | nop | O | nop |
58 | clock | clock | clock | clock | clock | clock | clock | clock | O | nop |
59 | fkey1 | fkey13 | fkey25 | fkey37 | fkey1 | fkey13 | fkey25 | fkey37 | O | K_VTF+1 |
60 | fkey2 | fkey14 | fkey26 | fkey38 | fkey2 | fkey14 | fkey26 | fkey38 | O | K_VTF+2 |
61 | fkey3 | fkey15 | fkey27 | fkey39 | fkey3 | fkey15 | fkey27 | fkey39 | O | K_VTF+3 |
62 | fkey4 | fkey16 | fkey28 | fkey40 | fkey4 | fkey16 | fkey28 | fkey40 | O | K_VTF+4 |
63 | fkey5 | fkey17 | fkey29 | fkey41 | fkey5 | fkey17 | fkey29 | fkey41 | O | K_VTF+5 |
64 | fkey6 | fkey18 | fkey30 | fkey42 | fkey6 | fkey18 | fkey30 | fkey42 | O | K_VTF+6 |
65 | fkey7 | fkey19 | fkey31 | fkey43 | fkey7 | fkey19 | fkey31 | fkey43 | O | K_VTF+7 |
66 | fkey8 | fkey20 | fkey32 | fkey44 | fkey8 | fkey20 | fkey32 | fkey44 | O | K_VTF+8 |
67 | fkey9 | fkey21 | fkey33 | fkey45 | fkey9 | fkey21 | fkey33 | fkey45 | O | K_VTF+9 |
68 | fkey10 | fkey22 | fkey34 | fkey46 | fkey10 | fkey22 | fkey34 | fkey46 | O | K_VTF+10 |
69 | nlock | nlock | nlock | nlock | nlock | nlock | nlock | nlock | O | |
70 | slock | slock | slock | slock | slock | slock | slock | slock | O | |
71 | fkey49 | '7' | fkey49 | '7' | fkey49 | escn | nop | nop | N | |
72 | fkey50 | '8' | fkey50 | '8' | fkey50 | escn | nop | nop | N | |
73 | fkey51 | '9' | fkey51 | '9' | fkey51 | escn | nop | nop | N | |
74 | fkey52 | '-' | fkey52 | '-' | fkey52 | escn | nop | nop | N | |
75 | fkey53 | '4' | fkey53 | '4' | fkey53 | escn | nop | nop | N | |
76 | fkey54 | '5' | fkey54 | '5' | fkey54 | escn | nop | nop | N | |
77 | fkey55 | '6' | fkey55 | '6' | fkey55 | escn | nop | nop | N | |
78 | fkey56 | '+' | fkey56 | '+' | fkey56 | escn | nop | nop | N | |
79 | fkey57 | '1' | fkey57 | '1' | fkey57 | escn | nop | nop | N | |
80 | fkey58 | '2' | fkey58 | '2' | fkey58 | escn | nop | nop | N | |
81 | fkey59 | '3' | fkey59 | '3' | fkey59 | escn | nop | nop | N | |
82 | fkey60 | '0' | fkey60 | '0' | fkey60 | escn | nop | nop | N | |
83 | del | '.' | del | '.' | del | escn | rboot | nop | N | |
84 | fkey60 | fkey26 | fkey60 | nop | sysreq | sysreq | sysreq | sysreq | O | |
85 | fkey58 | fkey58 | fkey58 | fkey58 | fkey58 | fkey58 | fkey58 | fkey58 | O | |
86 | fkey53 | fkey53 | fkey53 | fkey53 | fkey53 | fkey53 | fkey53 | fkey53 | O | |
87 | fkey11 | fkey23 | fkey35 | fkey47 | fkey11 | fkey23 | fkey35 | fkey47 | O | K_VTF+11 |
88 | fkey12 | fkey24 | fkey36 | fkey48 | fkey12 | fkey24 | fkey36 | fkey48 | O | K_VTF+12 |
89 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
90 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
91 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
92 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
93 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
94 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
95 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
96 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
97 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
98 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
99 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
100 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
101 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
102 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
103 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
104 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
105 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
106 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
107 | fkey53 | fkey53 | fkey53 | fkey53 | fkey53 | fkey53 | fkey53 | fkey53 | O | |
108 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
109 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
110 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
111 | fkey51 | fkey51 | nop | nop | nop | nop | nop | nop | O | K_NOP |
112 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
113 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
114 | ralt | ralt | ralt | ralt | ralt | ralt | ralt | ralt | O | K_NOP |
115 | rctrl | rctrl | rctrl | rctrl | rctrl | rctrl | rctrl | rctrl | O | K_NOP |
116 | slock | slock | brk | brk | slock | slock | brk | brk | O | nline |
117 | '/' | '/' | nop | nop | escn | escn | nop | nop | O | K_NOP |
118 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
119 | slock | slock | brk | brk | slock | slock | brk | brk | O | K_NOP |
120 | fkey50 | fkey50 | nop | nop | nop | nop | nop | nop | O | K_NOP |
121 | del | del | del | del | del | del | rboot | del | O | K_NOP |
122 | fkey57 | fkey57 | nop | nop | nop | nop | nop | nop | O | K_NOP |
123 | fkey60 | fkey60 | nop | nop | nop | nop | nop | nop | O | K_NOP |
124 | nop | nop | nop | nop | nop | nop | nop | nop | O | K_NOP |
125 | fkey55 | fkey55 | nop | nop | nop | nop | nop | nop | O | K_NOP |
126 | fkey59 | fkey59 | nop | nop | nop | nop | nop | nop | O | K_NOP |
127 | fkey49 | fkey49 | nop | nop | nop | nop | nop | nop | O | K_NOP |
The following table lists the value of each of the special keywords used in the preceding tables. The keywords are used only in the preceding tables for readability. In the actual keyboard map, a special keyword is represented by its value with the corresponding special state bit being set.
Name | Value | Meaning |
---|---|---|
nop | 0 | No operation - no action from keypress |
lshift | 2 | Left-hand shift |
rshift | 3 | Right-hand shift |
clock | 4 | Caps lock |
nlock | 5 | Numeric lock |
slock | 6 | Scroll lock |
alt | 7 | Alt key |
btab | 8 | Back tab key - generates fixed sequence (ESC[ Z) |
ctrl | 9 | Control key |
lalt | 10 | Left-hand alt key |
ralt | 11 | right-hand alt key |
lctrl | 12 | Left-hand control key |
rctrl | 13 | Right-hand control key |
agr | 14 | ALT-GR key (European keyboards only) |
fkey1 | 27 | Function key #1 |
... | ... | ... |
fkey96 | 122 | Function key #96 |
sysreq | 123 | System request |
brk | 124 | Break key |
escn | 125 | Generate an ESC N x sequence, where x is the un-alt'ed value of the scan code |
esco | 126 | Generate an ESC O x sequence, where x is the un-alt'ed value of the scan code |
escl | 127 | Generate an ESC L x sequence, where x is the un-alt'ed value of the scan code |
rboot | 128 | Reboot system |
debug | 129 | Invoke kernel debugger |
NEXT | 130 | Switch to next virtual terminal on queue |
PREV | 131 | Switch to previous virtual terminal on queue |
FNEXT | 132 | Forced switch to next virtual terminal on queue |
FPREV | 133 | Forced switch to previous virtual terminal on queue |
VTF | 134 | Virtual Terminal First (VT00) |
... | ... | ... |
VTL | 148 | Virtual Terminal Last (VT14) |
MGRF | 149 | Virtual Terminal Manager First. Allows assigning special significance to key sequence for actions by virtual terminal layer manager. Used in SRQTAB table. |
... | ... | ... |
MGRL | 179 | Virtual Terminal Manager Last. Used in SRQTAB table. |
The following table lists names and decimal values for ASCII characters in the preceding table. Names are used in place of numeric constants to make it easier to read the scan code table. Only the decimal values are placed in the ioctl buffer. These values are taken from ascii(5).
Name | Value |
---|---|
Name | Value |
nul | 0 |
soh | 1 |
stx | 2 |
etx | 3 |
eot | 4 |
enq | 5 |
ack | 6 |
bel | 7 |
bs | 8 |
ht | 9 |
nl | 10 |
vt | 11 |
np | 12 |
cr | 13 |
so | 14 |
si | 15 |
dle | 16 |
dc1 | 17 |
dc2 | 18 |
dc3 | 19 |
dc4 | 20 |
nak | 21 |
syn | 22 |
etb | 23 |
can | 24 |
em | 25 |
sub | 26 |
esc | 27 |
fs | 28 |
gs | 29 |
rs | 30 |
ns | 31 |
del | 127 |
The string mapping table is an array of 512 bytes (typedef strmap_t) containing null-terminated strings that redefine the function keys. The first null-terminated string is assigned to the first function key, the second string is assigned to the second function key, and so on.
There is no limit to the length of any particular string; however, the whole table can not exceed 512 bytes, including nulls. To make a string a null, add extra null characters. The following table contains default function key values.
Default function key values
Function
key # | Function |
<Shift>
function |
<Ctrl>
function |
<Ctrl>
<Shift>
function |
---|---|---|---|---|
1 | ESC OP | ESC Op | ESC OP | ESC Op |
2 | ESC OQ | ESC Oq | ESC OQ | ESC Oq |
3 | ESC OR | ESC Or | ESC OR | ESC Or |
4 | ESC OS | ESC Os | ESC OS | ESC Os |
5 | ESC OT | ESC Ot | ESC OT | ESC Ot |
6 | ESC OU | ESC Ou | ESC OU | ESC Ou |
7 | ESC OV | ESC Ov | ESC OV | ESC Ov |
8 | ESC OW | ESC Ow | ESC OW | ESC Ow |
9 | ESC OX | ESC Ox | ESC OX | ESC Ox |
10 | ESC OY | ESC Oy | ESC OY | ESC Oy |
11 | ESC OZ | ESC Oz | ESC OZ | ESC Oz |
12 | ESC OA | ESC Oa | ESC OA | ESC Oa |
#define K_RAW 0x00 /* Send row scan codes */ #define K_XLATE 0x01 /* Translate to ASCII */
#define KB_84 1 /*84 key keyboard*/ #define KB_101 2 /*101 key keyboard*/ #define KB_OTHER 3 /*Other type keyboard*/
struct kbentry { unchar kb_table; /* Table to use */ unchar kb_index; /* Entry in table */ ushort kb_value; /* Value to get/set */ };
Valid values for the kb_table
member are:
#define K_NORMTAB 0x00 /* Base */ #define K_SHIFTTAB 0x01 /* Shifted */ #define K_ALTTAB 0x02 /* Alt */ #define K_ALTSHIFTTAB 0x03 /* Shifted alt */ #define K_SRQTAB 0x04 /* Select sysreq table */
The ioctl will get the indicated entry from the indicated table and return it in the third field.
The K_SRNTAB value for the kb_table member allows access to the scancode indexed table which allows assignment of a given virtual terminal selector (K_VTF--K_VTL) or the virtual terminal layer manager (K_MGRF--K_MGRL) specialkey assignments.
The virtual terminal selector (K_VTF)
is normally associated with /dev/tty00,
on which the user login shell is commonly found.
The following terminal selectors also are used
to select virtual terminals:
K_VTF+1 for the 1st virtual terminal (/dev/vt01)
K_VTF+2 for the 2nd virtual terminal (/dev/vt02)
. . .
K_VTF+12 for the 12th virtual terminal (/dev/vt12)
The kd driver provides support for virtual terminals. The console minor device, /dev/vtmon, provides virtual terminal key requests from the kd driver to the process that has /dev/vtmon open. Two ioctls are provided for virtual terminal support:
v_active
field,
and the number of active virtual terminals
and a bit mask of the global state in the v_state
open field,
where bit x is the state of vt x
(1 indicates that the virtual terminal is open).
v_signal
)
to be sent to a bit mask of virtual terminals
(in v_state
).
The data structure used by the VT_GETSTATE and VT_SENDSIG ioctls is:
struct vt_stat { ushort v_active; /* active vt */ ushort v_signal; /* signal to send (VT_SENDSIG) */ ushort v_state; /* vt bit mask (VT_SENDSIG and VT_GETSTATE) */ };and is defined in /usr/include/sys/vt.h .
When the keyboard is fully enabled, an 8-bit character code can be obtained by holding down the <Alt> key and entering the 3-digit decimal value of the character from the numeric keypad. The character is transmitted when the <Alt> key is released.
Some keyboard characters have special meaning. Under default operations, pressing the <Del> key generates an interrupt signal that is sent to all processes designated with the associated control terminal. When the keyboard is fully enabled, holding down the <Alt> key and pressing the 8 key on the home keyboard (not on the numeric keypad) returns a null byte followed by 0x7F. This will produce the same effect as the <Del> key (0x7F) unless you have executed the stty(1) command with the -isig option.
struct fkeyarg { unsigned short keynum; unchar keydef [MAXFK]; /* from ioctl.h via comcrt.h */ char flen; };
The function key number must be passed in keynum (see arg structure above). The string currently assigned to the key will be returned in keydef and the length of the string will be returned in flen when the ioctl is performed.
keynum
,
the string must be passed in
keydef
,
and the length of the string (number of characters) must be
passed in
flen
.
/dev/console /dev/vt00-n /usr/include/sys/kd.h