Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re^2: Setting a timer to a system call

by Freezer (Sexton)
on Aug 16, 2012 at 09:13 UTC ( [id://987714]=note: print w/replies, xml ) Need Help??


in reply to Re: Setting a timer to a system call
in thread Setting a timer to a system call

I think that this code you link to looks interesting. However, oh so complicated. Is it worth reflecting on how other languages might handle this problem, as it seems that a new Perl command could be in order?

Replies are listed 'Best First'.
Re^3: Setting a timer to a system call
by zentara (Archbishop) on Aug 16, 2012 at 15:47 UTC
    It dosn't get much simpler than this. Instead of the SIG(INT), you could just directly call exit, for a quicker kill.
    #!/usr/bin/perl -w use strict; use threads; use threads::shared; my $timer_go:shared = 0; my $worker = threads->create(\&worker); my $timer = threads->create(\&timer,$worker); print "hit enter to start\n"; <>; $timer_go=1; <>; $timer->join(); $worker->join(); sub timer { my $worker = shift; while(1){ if($timer_go){ my $count = 0; while(1){ $count++; if($count > 5){ print "timed out\nHit enter to finish\n"; # Send a signal to a thread $worker->kill('INT'); return; } sleep 1; print "timing $count\n"; } }else{sleep 1} } } sub worker { $|++; $SIG{INT} = sub{ warn "Caught Zap!\n"; sleep 1; exit; }; # do your timed program here. my $worker_pid = open( READ, "top -d 1 -b |" ); print "\t$worker_pid\n"; while(<READ>){ } return; }

    I'm not really a human, but I play one on earth.
    Old Perl Programmer Haiku ................... flash japh
      Global symbol "$timer_go" requires explicit package name
      I presume that message is to be expected.
      I can get this program to go through the cycle once. However it will not go through the cycle more than once when the subroutines are activated from within a loop. Can this problem be easily fixed and can the reasons why be quickly explained?
      system ($call); # This is where my system call is my $worker_pid = open( READ, "top -d 1 -b |" ); # What does this + line mean? print "\t$worker_pid\n"; while(<READ>){ } return; }
      My question is embedded in the code. Thanks.
        That is called a piped open, where I run the program "top'" and collect output from it. It was just meant as an example, you could put "system( my_java )" or whatever you want done in the thread.

        I'm not really a human, but I play one on earth.
        Old Perl Programmer Haiku ................... flash japh

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others learning in the Monastery: (2)
As of 2024-04-26 05:21 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found