start page | rating of books | rating of authors | reviews | copyrights

Perl Cookbook

Perl CookbookSearch this book
Previous: 16.17. Writing a Signal Handler Chapter 16
Process Management and Communication
Next: 16.19. Avoiding Zombie Processes
 

16.18. Catching Ctrl-C

Problem

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.

Solution

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"; }

Discussion

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.

See Also

Your system's stty (1) manpage (if you have one); Recipe 15.8 ; Recipe 16.17


Previous: 16.17. Writing a Signal Handler Perl Cookbook Next: 16.19. Avoiding Zombie Processes
16.17. Writing a Signal Handler Book Index 16.19. Avoiding Zombie Processes

Library Navigation Links

Copyright © 2001 O'Reilly & Associates. All rights reserved.