The kernel's terminal driver (
termios) interprets the special keys that can be typed to send a signal to a process, send end of file, erase characters, etc. This is basic Unix kernel functionality and very similar on most Unix and Linux implementations.
stty command displays or sets the
termios special characters, as well as other parameters for the terminal line driver.
stty -a to see the current values of the special characters and other "terminal line settings". In the following examples, you can see that
intr is Ctrl+C,
eof is Ctrl+D,
susp is Ctrl+Z. (I've deleted other output to show only the special character settings):
stty -a special chars on GNU/Linux:
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
stty -a special characters on FreeBSD:
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = ^@; eol2 = ^@;
erase = ^?; erase2 = ^H; intr = ^C; kill = ^U; lnext = ^V;
min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
stop = ^S; susp = ^Z; time = 0; werase = ^W;
To change the value of a special character, for example, to change the interrupt character from Ctrl+C to Ctrl+E invoke
stty like this (
^E is literally two characters, the circumflex (
^) followed by the letter
stty intr '^E'
For more information see the man pages for
termios. On GNU/Linux you can also look at the
tty_ioctl man page.
intr key (Ctrl+C by default), doesn't actually kill the process, but causes the kernel to send an interrupt signal (
SIGINT) to all processes within the process group. The processes may arrange to catch or ignore the signal, but most processes will terminate, which is the default behavior.
The reason that Ctrl+d logs you out is because the terminal line driver sends EOF (end of file) on the standard input of the shell. The shell exits when it receives end of file on it's standard input.