use strict; use warnings; use POSIX (); my $new_interrupt_char = 'A'; my $seconds_to_sleep = 5; if ( POSIX::isatty( POSIX::STDIN_FILENO ) ) { my $term = POSIX::Termios->new(); $term->getattr( POSIX::STDIN_FILENO ); my $old_interrupt_char = $term->getcc( POSIX::VINTR ); $term->setcc( POSIX::VINTR, ord $new_interrupt_char ); $term->setattr( POSIX::STDIN_FILENO ); END { # restore the interrupt char to default (Control-C) if ( defined $term ) { $term->setcc( POSIX::VINTR, $old_interrupt_char ); $term->setattr( POSIX::STDIN_FILENO ); } } } $SIG{INT} = sub { print "SIGINT handler called\n"; }; my $slept = sleep $seconds_to_sleep; # use waitpid instead of sleep if ( $slept != $seconds_to_sleep and $! == POSIX::EINTR ) { print "Sleep was interrupted, slept $slept secs\n"; }