Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12412[/thread]

Perl soll C programm vorzeitig beenden



<< >> 6 Einträge, 1 Seite
Gast Gast
 2008-08-27 16:21
#114036 #114036
Hallo,
ich habe ein perl programm welches mir ein C-programm mittels system startet.
nun meine frage: ist es möglich das C programm vorzeitig nach einer bestimmten zeit zu beenden?


MFg

Gast
nepos
 2008-08-27 16:56
#114039 #114039
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Du kannst mittels alarm() einen Timer benutzen.
Code (perl): (dl )
1
2
alarm(1);
system( "sleep", 10 );
murphy
 2008-08-27 19:04
#114040 #114040
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
nepos+2008-08-27 14:56:10--
Du kannst mittels alarm() einen Timer benutzen.
[...]


Das funktioniert aber nur, wenn man beim Auftreten des Alarmsignals nicht nur den Subprozess, sondern auch das Perlskript selbst beenden will.

Will man nur den Subprozess beenden, ist es ein wenig komplizierter:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
use strict;
use warnings;

use constant {
    TIMEOUT => 3
};

my $pid = fork;
die "Failed to spawn subprocess: $!\n" unless (defined($pid));

if ($pid) {
    $SIG{ALRM} = sub {
        kill TERM => $pid;
    };
    alarm TIMEOUT;

    if (waitpid($pid, 0) == $pid) {
        my ($err, $sig) = ($? >> 8, $? & 127);

        if ($sig) {
            print "Child died from signal $sig\n";
            exit $sig;
        }
        else {
            print "Child exited normally with status $err\n";
            exit $err;
        }
    }
    else {
        die "Error waiting for child: $!\n";
    }
}
else {
    exec @ARGV or die "Failed to run command: $!\n";
}
When C++ is your hammer, every problem looks like your thumb.
betterworld
 2008-08-28 02:05
#114043 #114043
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Wenn dieses ominöse C-Programm die ganze Zeit beschäftigt ist (d. h. nicht auf IO oder sonstige Ereignisse wartet), kann man auch ulimit (aka setrlimit) nehmen:
Code: (dl )
system("ulimit -t 1; factor 9999999999999999987");

Das funktioniert so jetzt allerdings nur in einer Bourne Shell oder einer Shell, die genügend davon abgeguckt hat, dass es diesen Befehl gibt.

Bei mir stirbt "factor" hier nach einer Sekunde. Je nach dem, wie schnell der Rechner ist, kann es auch sein, dass es 9999999999999999987 ausgibt.
murphy
 2008-08-28 23:58
#114051 #114051
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Resourcenlimits kann man auch von Perl aus mit Hilfe des Modules CPAN:BSD::Resource setzen.
When C++ is your hammer, every problem looks like your thumb.
Gast Gast
 2008-09-08 14:02
#114343 #114343
danke an alle,
habe es jetzt so gemacht wie betterworld es vorgeschalgen hat

Mfg

Gast
<< >> 6 Einträge, 1 Seite



View all threads created 2008-08-27 16:21.