Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

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

by bart (Canon)
on Oct 18, 2003 at 12:20 UTC ( [id://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

    JamesNC

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://300273]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others imbibing at the Monastery: (6)
As of 2024-04-18 10:37 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found