Article 4820 of comp.lang.perl:
Xref: feenix.metronet.com comp.lang.perl:4820
Newsgroups: comp.lang.perl
Path: feenix.metronet.com!news.ecn.bgu.edu!usenet.ins.cwru.edu!magnus.acs.ohio-state.edu!math.ohio-state.edu!cs.utexas.edu!usc!elroy.jpl.nasa.gov!decwrl!news.kpc.com!kpc!chrnlgc!themis!mac
From: [email protected] (Michael T.Y. McNamara)
Subject: Re: perl's equiv of csh 'limit'?
In-Reply-To: [email protected]'s message of Tue, 3 Aug 1993 16:07:02 GMT
Message-ID: <[email protected]>
Sender: [email protected]
Nntp-Posting-Host: rhea
Reply-To: [email protected]
Organization: Chronologic Simulation
References: <[email protected]>
Date: Thu, 5 Aug 1993 21:56:38 GMT
Lines: 86


>>>>> On Tue, 3 Aug 1993 16:07:02 GMT, [email protected] (Lee Qiao ~{GG@hT*~}) said:
> Is there a Perl equivalent of csh's 'limit' command
> (or the 'vlimit' call in C)?  Currently I am using the
> following,
> open(STUFF, "/bin/csh -f -c 'limit cputime 150; <some process>|'");
> which seems a little inefficient to me.
> If you have any ideas please reply by e-mail.  Thank you!
       Did so, but for the rest of you:

Snipped out of my verilog compiler regression perl driver, which wants
to arrange so that children generate no corefiles, don't run into
"arbitrarily small" stack limits, and don't infinate loop:

To get a file handle from which you could read the output, you will
need to much about in the spawnntime to have the parent open a pipe
before the fork and have the child hook it's stdout to the write piece
of the pipe... Left as an exercise...


require 'syscall.ph';
require 'sys/resource.ph'; # note h2ph doesn't always win on this one
                          # -- hand editing may be necessary

# Arrange so no core files are generated
$coresize = pack("i2",0,0);
syscall(&SYS_setrlimit, &RLIMIT_CORE, $coresize);

# Make stack size large
$stacksize = pack("i2",1024*1024*4,1024*1024*4);
syscall(&SYS_setrlimit, &RLIMIT_STACK, $stacksize);

..

foreach (test...)
   @cmpl_time = &spawnntime("$compile_cmd > $output 2>&1",3000);
   printf "cmpl: %.2f ",$cmpl_time[2];
       ...
   @run_time = &spawnntime("$run_cmd > $output 2>&1",3000);
   printf "run: %.2f ",$run_time[2];

}

sub spawnntime {
   local($cmd,$limittime) = @_;
   local(@start,@end,@diff);
   @start = times;
 FORK: {
     if ($child_pid = fork ) {
         waitpid($child_pid,0);        # Parent -  wait for child to finish
         &report_err($cmd) if ( $? );
         @end = times;
         $diff[0] = $end[0] - $start[0];
         $diff[1] = $end[1] - $start[1];
         $diff[2] = $end[2] - $start[2];
         $diff[3] = $end[3] - $start[3];
         $child_pid = 0;
         return @diff;

     } elsif (defined $child_pid) {
       # Child  -  run argument
         if( $limittime) {
             @so_far = times();
             $timelimit = pack("i2", $limittime+$so_far[0], $limittime*2+$so_far[0]);
             syscall(&SYS_setrlimit, &RLIMIT_CPU, $timelimit);
         }
         exec("$cmd");
         &report_err($cmd) if ( $? );
         exit;

     } elsif ( $! =~ /No more process/ ) {
         # EAGAIN, presumably recoverable...
         sleep 5;
         redo FORK;
     } else {
         die "Can not fork: $!\n";
     }
 }
}


--
Michael T.Y. McNamara                          1+(415) 965-3312
,------.                                       1+(415) 965-2705 FAX
|CHRONO|LOGIC SIMULATION                       [email protected]
`------'       {yes, company has new logo..  *sigh*}