Schrift
[thread]12652[/thread]

sysread und alert: kein Abbruch

Leser: 1


<< >> 2 Einträge, 1 Seite
burnersk
 2008-10-17 19:53
#115602 #115602
User since
2008-03-25
83 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich möchte in einer while-Schleife den STDIN mit sysread auslesen.

In alarm habe ich folgendes Beispiel gefunden (angepasst)
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
print 'Eingabe: ', eval
{
  local $SIG{ALRM} = sub { die "alarm\n" };
  alarm(1);
  my $buffer = '';
  while (1) 
  {
    my $tmp = '';
    sysread(STDIN, $tmp, 1024);
    $buffer .= $tmp;
  }
  alarm(0);
  return $buffer;
};

Nun sollte doch nach (ungefähr) einer Sekunde SIGALRM kommen und das Auslesen mittels sysread unterbrochen werden und der eval verlassen werden.
Nur leider passiert dies nicht.

Ich habe ActivePerl 5.8.8 unter Win32.
FoolAck
 2008-10-17 20:10
#115603 #115603
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Also der Timout funktioniert, nur das returnen des Buffers irgendwie nicht, auch:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
my $retval = eval {
local $SIG{ALRM} = sub { exit };
alarm 10;
my $input = '';
while (<>) {
$input .= $_;
}
alarm 0;
return $input;
};
print $retval;

"funzt nicht".
Grade mal schaun was eval eigentlich zurückgeben soll..

Zu dir: bist du dir sicher, dass "alarm" unter windows funktioniert? Ist doch afaik ein system-call, oder? Und ipc ist meist sehr plattformspezifisch...

edit:
Quote
In both forms, the value returned is the value of the last expression evaluated inside the mini-program; a return statement may be also used, just as with subroutines.

ABER: das return wird ja nie erreicht, weil der signal-handler einfach exit macht. *Licht aufgeh*

edit:
Code: (dl )
1
2
3
4
5
6
7
8
9
my $input = '';
eval {
local $SIG{ALRM} = sub { die; };
alarm 3;
while (<>) {
$input .= $_;
}
};
print $input;

Works for me™

editagain:
hm? Und noch hier.
Welches Windows verwendest du denn genau?
<< >> 2 Einträge, 1 Seite



View all threads created 2008-10-17 19:53.