in reply to Have $SIG{INT} ask if user wants to quit
While I am not certain I suspect that the problem arises because the signal is interrupting the read on STDIN then in the signal handler you are reading from STDIN and then, if the user chooses not to quit, the original read resumes, but now its input buffers have been confused by the read in the interrupt handler.
One way to avoid reading from STDIN in the signal handler is as follows:
#!/usr/bin/perl use strict; use warnings; foreach my $prompt ( "eat tacos for sustenance", "eat ham for sustenance", ) { eval { local $SIG{INT} = sub { die "caught sig\n"; }; print "$prompt: "; chomp(my $ans=<STDIN>); print "\nans = $ans\n"; }; if($@ eq "caught sig\n") { print "\nDo you really want to quit? "; my $ans = <STDIN>; exit(1) if($ans =~ m/^y/i); redo; } }
In this case, the signal handler terminates the eval, terminating the read. The following code then prompts the user and either terminates the program or repeats the loop block, depending on the answer.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Have $SIG{INT} ask if user wants to quit
by walkingthecow (Friar) on Mar 11, 2009 at 17:10 UTC | |
by ig (Vicar) on Mar 12, 2009 at 14:40 UTC |