Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw

Re: sleep doesn't respond to sigint(2)?

by bart (Canon)
on Oct 18, 2003 at 12:20 UTC ( #300273=note: print w/replies, xml ) Need Help??

in reply to sleep doesn't respond to sigint(2)?

Well, why it does work on Indigoperl 5.6.1 (Win32, ActivePerl-compatible), I do get a "illegal instruction" fatal error on Win98 — known on other platforms as a segfault. So the old behaviour isn't any better than the new one.

Well, the page that snax pointed to says "... there are serious caveats, such as inability to die() or exit() from a signal handler.".

p.s. Did alarm() get fixed on 5.8.x? Because on perl5.6.x/Win32, it doesn't interrupt a sleep(), like it does (and should) on other platforms.

  • Comment on Re: sleep doesn't respond to sigint(2)?

Replies are listed 'Best First'.
Re: Re: sleep doesn't respond to sigint(2)?
by JamesNC (Chaplain) on Oct 18, 2003 at 13:40 UTC
    Alarm works on Win32, but not ALL the time such as when you do a blocking system calls like  $response = <stdin> Abigail explains why this is so. Here is a sub that I wrote that will get you around the <stdin> problem that uses Term::ReadKey. If you don't supply a sub handler... it will just use a default... this is pretty useful for getting input from the keyboard when you want to timeout... play with it... you will get the idea..
    #!/perl/bin/perl -w use strict; my $input = &my_stdin( prompt =>"Enter some text: ", timeout => 3, handler => \&my_alarm ); print "You entered: $input \n"; sub my_stdin { use Term::ReadKey; $| = 1; #turn buffering off so we can see our print below my %args = @_; my ($output,$key ); my $prompt = $args{'prompt'}; my $timeout = $args{'timeout'}; my $toh = $args{'handler'}; # ref to a handler $SIG{ALRM} = $toh || sub { print "Timeout\n"; exit;}; alarm($timeout); print $prompt; ReadMode 4; while(1){ if(defined($key = ReadKey(-1))){ my $val = ord $key; # 8 is backspace 10 and 13 are $output .= $key unless $val == 8 || $val == 10 || $val == 13; #echo to the screen print $key if length $output > 0; alarm($timeout); #reset the alarm #last if the user hits return last if ( $val == 10 || $val == 13); # chop one if we get a backspace if( $val == 8 ){ chop $output; print " "; print chr(8); } } } ReadMode 0; print "\n"; $output; } sub my_alarm{ print "I just died because you waited too long!"; exit; }

    Update: missing code added :-)
    Update2: added code to handle backspaces


Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://300273]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (3)
As of 2018-06-23 01:34 GMT
Find Nodes?
    Voting Booth?
    Should cpanminus be part of the standard Perl release?

    Results (125 votes). Check out past polls.