You want to intercept Ctrl-C, which would otherwise kill your whole program. You'd like to ignore it or run your own function when the signal is received.
Set a handler for
SIGINT. Set it to
"IGNORE"
to make Ctrl-C have no effect:
$SIG{INT} = 'IGNORE';
Or, set it to a subroutine of your own devising to respond to Ctrl-C:
$SIG{INT} = \&tsktsk; sub tsktsk { $SIG{INT} = \&tsktsk; # See ``Writing A Signal Handler'' warn "\aThe long habit of living indisposeth us for dying.\n"; }
Ctrl-C isn't directly affecting your program. The terminal driver processing your keystrokes recognizes the Ctrl-C combination (or whatever you've set your terminal to recognize as the interrupt character), and sends a SIGINT to every process in the foreground process group ( foreground job ) for that terminal. The foreground job normally comprises all programs started from the shell on a single command line, plus any other programs run by those programs. See the section on " "Signals " in the Introduction to this chapter for details.
The interrupt character isn't the only special character interpreted by your terminal driver. Type
stty
-a
to find out your current settings:
% stty -a
speed 9600 baud; 38 rows; 80 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
-extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel -ignbrk
brkint -inpck -ignpar -parmrk
oflags: opost onlcr oxtabs
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
-dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef;>
eol2 = <undef; erase = ^H; intr = ^C; kill = ^U; lnext = ^V;>
min = 1; quit = ^\; reprint = ^R; start = ^Q; status = <undef;>
stop = ^S; susp = ^Z; time = 0; werase = ^W;
The last section,
cchars:
, is the list of special characters.
Recipe 15.8
shows you how to change these from your script without calling the
stty
program.
Your system's stty (1) manpage (if you have one); Recipe 15.8 ; Recipe 16.17
Copyright © 2001 O'Reilly & Associates. All rights reserved.