5 Sekunden auf BEnutzereingabe warten ansonsten weiter
Mark
- perl
0 Alexander (HH)0 Mark0 Christian Kruse0 Mark0 Mark0 Christian Kruse
Hallo,
ich frage in Perl eine Benutzereingabe ab (<STDIN>). Sollte diese nicht innerhalb einer gewissen Zeitdauer getätigt werden soll es im Script weitergehen.
Wie setzt man dies am Besten um?
Gruß
Mark
Moin Moin!
ich frage in Perl eine Benutzereingabe ab (<STDIN>). Sollte diese nicht innerhalb einer gewissen Zeitdauer getätigt werden soll es im Script weitergehen.
perlfaq8/How to I timeout a slow event, perlipc/Signals.
Haken: Das funktioniert unter Windows nur mit viel Glück, weil Windows keine Signale kennt. Das es überhaupt funktioniert, liegt daran, dass Perl Signale emuliert. Aber eben nicht perfekt.
Alexander
perlfaq8/How to I timeout a slow event, perlipc/Signals.
Haken: Das funktioniert unter Windows nur mit viel Glück, weil Windows keine Signale kennt. Das es überhaupt funktioniert, liegt daran, dass Perl Signale emuliert. Aber eben nicht perfekt.
Alexander
Hallo Alexander,
Danke für Deine Antwort, aber irgendwie bin ich damit nicht so glücklich. Könnte man das ganze nicht ggf. mit Threads lösen?
Gruß
Moin Mark,
Danke für Deine Antwort, aber irgendwie bin ich damit nicht so glücklich. Könnte man das ganze nicht ggf. mit Threads lösen?
Theoretisch sicher. Wäre halt mit Kanonen auf Spatzen geschossen. Du kannst einen Thread starten, in dem das <STDIN> machen und im Haupt-Thread nach 5 Sekunden den <STDIN>-Thread canceln.
Sinnvoller wäre allerdings entweder eine Lösung über select() (das ist auch der Weg, den man üblicherweise in C gehen würde) oder eine Lösung über alarm().
LG,
CK
Sinnvoller wäre allerdings entweder eine Lösung über select() (das ist auch der Weg, den man üblicherweise in C gehen würde) oder eine Lösung über alarm().
Hallo CK,
mit select() komme ich nicht so ganz weiter:
my $rin="";
my switch="";
vec($rin,fileno(STDIN),1)=1;
select($switch=$rin,undef,undef,5);
Das macht schon fast was ich will. Nur gibt mir select den STDIN auch aus, das möchte ich nicht. Es soll ja nur in der Variable $switch stehen.
Gruß
So funktioniert es. Danke für Eure Anregungen.
eval {
local $SIG{ALRM} = sub { die "alarm\n" };
alarm 5;
chomp($remark = <STDIN>);
};
alarm 0;
Moin Mark,
mit select() komme ich nicht so ganz weiter:
my $rin="";
my switch="";
vec($rin,fileno(STDIN),1)=1;select($switch=$rin,undef,undef,5);
>
> Das macht schon fast was ich will. Nur gibt mir select den STDIN auch aus, das möchte ich nicht. Es soll ja nur in der Variable $switch stehen.
Du musst selber noch lesen. Und an deiner Stelle würde ich auch IO::Select nehmen, das ist eine Abstraktion, die dir schon einiges abnimmt.
LG,
CK
--
<http://ck.kennt-wayne.de/>