On 2000/05/26, In <tfhtisospckcr7spdptj58acjuqnd7jl05@4ax.com>, Bernie Cosell wrote:
> Can you set your process's (and most importantly, its children's)
> resource limits (via the setrlimit(2) system call) from Perl?
Surely. Here's an example, a wrapper around setrlimit(RLIMIT_CPU).
# Note that I've hardcoded things like EPERM,EFAULT,EINVAL from sys/
+errno.h,
# SYS_setrlimit from sys/syscall.h, and RLIMIT_CPU from sys/resource
+.h
# it might be preferable to h2ph the respective .h files...
sub set_max_cpu_time
{
my $n_seconds = shift;
my $s = pack( 'LL', $n_seconds, $n_seconds+1 );
$! = 0;
if ( syscall( 128, 0, $s ) == -1 ) # SYS_setrlimit, RLIMIT_CPU
{
if ( $! == 1 ) # EPERM
{
die "$!; Sorry, you need to be superuser to do that.\n";
}
elsif ( $! == 14 ) # EFAULT
{
die "$!; Error: argument to setrlimit pointed to an illegal ad
+dress.\n";
}
elsif ( $! == 22 ) # EINVAL
{
die "$!; Error: the new rlim_cur exceeds the new rlim_max,
or the limit specified cannot be lowered because current usa
+ge
is already higher than the limit.\n";
}
}
}
# test it:
set_max_cpu_time( 8 );
my $n = 0;
while ( 1 ) { $n++ }
# Hmm, mysteriously dumps core after about 8 seconds! :-)