Schrift
[thread]8578[/thread]

$SIG{ALRM} unter windows: bricht nicht nach n sec. ab

Leser: 1


<< >> 4 Einträge, 1 Seite
styx-cc
 2006-12-13 19:41
#72528 #72528
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Hallo, ich versuche gerade ein Netzwerkscript zu schreiben, was alle 15 min. einen Ping an einen Server schickt, in der Zwischenzeit aber auch andere aufgaben erledigt, natuerlich..
Ich versuche es mit $SIG{ALARM}, allerdings wird in dem Beispiel nicht nach 5 Sekunden abgebrochen, sondern man kann weiterhin eine Eingabe taetigen..
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
use strict;
use warnings;
print STDERR "Geben sie ein Passwort ein: ";
my $pwd =
eval {
local $SIG{ALRM} = sub { die "pwd-timeout\ n"};
alarm(5);
return <STDIN>;
};
alarm(0);
print STDERR "Zeit abgelaufen" if $@ =~ /pwd-timeout/;


Spaeter will ich das natuerlich so umbauen, das ich als Sub fuer den ALRM eine Routine fuer den Ping angebe.

P.s.: WinXP prof. SP2, perl 5.8.8\n\n

<!--EDIT|styx-cc|1166031797-->
Pörl.
esskar
 2006-12-13 20:45
#72529 #72529
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hmm, ich glaub, dass geht nicht in verbindung mit <STDIN>;

hab mal jetzt mit beiden stücken rumgespielt:


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use strict;
use warnings;

my $pwd = eval {
local $SIG{ALRM} = sub { die "Alarm" };
alarm(5);

my $x = 10;
while($x--) {
print STDERR "sleep $x";
sleep(1);
}
alarm(0);
};

if ($@ and $@ =~ /Alarm/) {
print "Problem! Zeit abgelaufen!\n";
}
else {
print "Alles klar!\n";
}


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use strict;
use warnings;

my $pwd = eval {
local $SIG{ALRM} = sub { die "Alarm" };
alarm(5);

<STDIN>;

my $x = 10;
while($x--) {
print STDERR "sleep $x";
sleep(1);
}
alarm(0);
};

if ($@ and $@ =~ /Alarm/) {
print "Problem! Zeit abgelaufen!\n";
}
else {
print "Alles klar!\n";
}
styx-cc
 2006-12-13 21:11
#72530 #72530
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Super, das klappt schonmal =)
Allerdings erreiche ich mein entgueltiges Ziel noch nicht, ich hab den Code mal umgebaut:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use strict;
use warnings;

keep_alive(1);
sub main_program {
my $x = 10;
while($x--) {
print STDERR "sleep $x";
sleep(5);
}
}

sub keep_alive {
my $first = shift;
my $timeout = eval {
local $SIG{ALRM} = sub {print "SERVER-PING!\n"; keep_alive(0)};
alarm(15);
main_program() if $first == 1;
alarm(0);
};
}


Jetzt waere meine Frage, wie schaffe ich es das eine Art Timer rings um mein Script kommt, der alle 15 min eine Subroutine ausfuehrt, so wies da oben steht kanns ja nicht gehen, da er beim zweiten durchlauf nix mehr zu tun hat... allerdings faellt mir einfach nichts ein, ich hab da schon ne menge mit fork() probiert, allerdings habe sich dann das Problem das ich meine Globale Variable nicht mehr auf alle Prozesse auswirkt..

MfG
Pörl.
styx-cc
 2006-12-13 21:17
#72531 #72531
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Ha, war ganz einfach =)
Diese Zeile:
Code: (dl )
local $SIG{ALRM} = sub {print "SERVER-PING!\n"; keep_alive(0)};

Nach:
Code: (dl )
local $SIG{ALRM} = sub {print "SERVER-PING!\n"; alarm(15)};
geaendert..

MfG
Pörl.
<< >> 4 Einträge, 1 Seite



View all threads created 2006-12-13 19:41.