Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

Re^2: IO::Select and alarm()

by Maddingue (Sexton)
on Mar 19, 2009 at 15:17 UTC ( #751749=note: print w/ replies, xml ) Need Help??


in reply to Re: IO::Select and alarm()
in thread IO::Select and alarm()

Thank you, it works.

Now I feel stupid because I should have remembered this :)


Comment on Re^2: IO::Select and alarm()
Re^3: IO::Select and alarm()
by ikegami (Pope) on Mar 19, 2009 at 16:04 UTC

    There's a difference between can_read and select. can_read returns immediately when the object has no file handles, but I assumed it sleeps indefinitely like select in that situation.

    That means there's a bug in my earlier version. The OP's code is equivalent to

    use Errno qw( EINTR ); while ($select->count()) { my @ready = $select->can_read() or do { next if $! == EINTR; last; # Should be die("select: $!\n"); }; for my $fh (@ready) { ... } }
      I just spotted this note and have a couple of questions on this myself. I have a piece of code that also uses can_read() and needs to deal with signals. Or does it?

      My code is actually modeled after the example in the IO:Select man page here - http://perldoc.perl.org/IO/Select.html which does not do anything special about premature wakeup:

      while(@ready = $sel->can_read) { foreach $fh (@ready) { if($fh == $lsn) { # Create a new socket $new = $lsn->accept; $sel->add($new); } else { # Process socket # Maybe we have finished with the socket $sel->remove($fh); $fh->close; } } }

      Since my code DOES seems to work correctly, even when dealing with hundreds of connections while an alarm is going off every second, my question becomes WHY does it work when I'm not paying any attention to EINTR? Am I just lucky - I highly doubt it? A number of people have been using this code for years...

      When I instrumented the code it looks like the timer interrupt is indeed waking it from the can_read(). But then it immediately falls through the loop and cycles around back to the can_read(), and also wakes when there real data to process and deal with it appropriately.

      As an aside, I also did try the recommended way for doing this, which pays attention to EINTR, and that works as well. So the questions then become is one way preferred to the other and why does my code, written the way it is, seem to be rock solid?

      -mark

        Since my code DOES seems to work correctly,

        $ perl -MIO::Select -E' my $sel = IO::Select->new(\*STDIN); $SIG{ALRM} = sub { }; alarm(1); while (my @ready = $sel->can_read()) { # ... } say "HERE"; ' HERE

        The OP doesn't want to reach HERE, but apparently that's not a problem for you.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (7)
As of 2014-12-19 05:04 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (70 votes), past polls