Thu Jul 15 05:30:45 2010: Request 59322 was acted upon. Transaction: Correspondence added by dbec...@roadrunner.com Queue: Win32-Console Subject: Re: [rt.cpan.org #59322] SetConsoleCtrlHandler function not supported Broken in: 0.09 Severity: Important Owner: Nobody Requestors: c...@cpan.org Status: open Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=59322 >
Chris Marshall via RT wrote: > > So the problem appears that the 1st Ctrl-C is caught > but something in the readline part prevents reloading > of the signal handler so an immediate Ctrl-C will > send another "SIGINT" which will not be caught and > then the console control handler will be called which > offers to exit the CMD console. (Presumably, the > default handler was also called from the 2nd Ctrl-C > in perl which is why that application exited.... > > I think I've convinced myself it is tied in with the > Term::ReadLine::Perl stuff but don't know how it > could be fixed. If that is the case, having the > missing SetConsoleCtrlHandler() routine might not > help either. Looks like 1) you have to stop reading after you get an EOF from readline; 2) readline seems to catch the first ^C and quits working after that - then you can catch ^C OK; 3) you can't create a new Readline obj after it fails. New test case: use strict; use warnings; use Term::ReadLine; $| = 1; my $cnt = 0; sub handler { print "Caught a SIG '$_[0]' - continuing\n"; die "Got three" if ++$cnt > 2; } $SIG{INT} = \&handler; my $term = new Term::ReadLine 'ProgramName'; while (1) { my $input = $term->readline('prompt> '); if (not defined $input) { print "EOF on input\n"; } elsif ($input eq 'q') { print "quitting\n"; exit; } else { printf "Got: '%s'\n", $input; } Win32::Sleep(1000); # stop runaway console } __END__ There's definitely some work that could be done in readline to make this a little more friendly and some docs to go with.