Schrift
[thread]5775[/thread]

Testen ob in STDIN was drin ist: oder ob da nix drin ist...



<< >> 10 Einträge, 1 Seite
blackm
 2003-09-29 14:19
#58331 #58331
User since
2003-09-22
10 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi,

gibt es eine Moeglichkeit zu testen ob in STDIN was drin ist, bevor ich anfange daraus zu lesen?

by, Martin
format_c
 2003-09-29 14:31
#58332 #58332
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Sag mal in welchem Bezug.
Als Benutzereingabe, Teil einer Pipe?

Gruß Alex
Geewiz
 2003-09-29 14:37
#58333 #58333
User since
2003-09-29
69 Artikel
BenutzerIn
[Homepage] [default_avatar]
Davon weiss ich nichts. Aber wo liegt das Problem dabei, nach dem ersten Lesen auf Erfolg zu prüfen und ggf. abzubrechen?

Code: (dl )
1
2
3
while (<>) {
...
}
format_c
 2003-09-29 14:40
#58334 #58334
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Prüfen iss net.
Entweder will dein Programm was von STDIN oder nicht.
Wenns was von STDIN will, wartet es solange bis was mit \n bestätigt kommt.

Gruß Alex
blackm
 2003-09-29 14:52
#58335 #58335
User since
2003-09-22
10 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=format_c,29.09.2003, 12:40]Wenns was von STDIN will, wartet es solange bis was mit \n bestätigt kommt.[/quote]
> Wenns was von STDIN will, wartet es solange bis was mit \n bestätigt kommt.

Ja, das ist ebend das Problem.

Mein Programm bekommt eine Mail per STDIN uebergeben. Fuer den Fall das keine Mail kommt soll es mit einem Fehler abbrechen. Oder kann ich irgendwie ein Timeout einbauen? Wenn er nach 1 minute nix bekommen hat, dann abbrechen?!

by, Martin
Geewiz
 2003-09-29 15:10
#58336 #58336
User since
2003-09-29
69 Artikel
BenutzerIn
[Homepage] [default_avatar]
Das stimmt natürlich. Einfaches Lesen führt unter Umständen zur Blockierung.

Dafür gibt's die "select" Funktion: perldoc -f select

Oder noch hübscher: IO::Select. Da kann man dann can_read abfragen.
tomlong
 2003-09-29 15:18
#58337 #58337
User since
2003-08-04
93 Artikel
BenutzerIn
[default_avatar]
Weiss nicht ob es in deinem Fall funktioniert ... aber auf normaler Kommandozeilenebene gibts das Array @ARGV
könntest dann einfach so prüfen:
if ( @ARGV > 0 ) { }
Live long and prosper!
42;
blackm
 2003-09-29 15:30
#58338 #58338
User since
2003-09-22
10 Artikel
BenutzerIn
[Homepage] [default_avatar]
In @ARGV stehen aber nur die Argumente drin die ich dem Programm uebergeben habe. Das was ueber STDIN an das Programm gesendet wird steht dort nicht drin. Mein Programm wird folgendermassen aufgerufen
Code: (dl )
cat mail | mda [EMAIL=user1@asd.de]user1@asd.de[/EMAIL] [EMAIL=user2@dfg.de]user2@dfg.de[/EMAIL]

Ich schau mir mal select und IO::Select an.

by, Martin
betterworld
 2003-09-29 15:38
#58339 #58339
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Die Frage ist, was genau Du mit "drin ist" meinst. Wenn STDIN vom Terminal kommt, ist immer was "drin", bis jemand Strg-D (bzw Strg-Z auf einigen Betriebssystemen) drueckt. Wenn allerdings _wirklich_ nix drin ist kannst Du es mit eof testen:
Code: (dl )
: | perl -le 'print eof(STDIN)'
blackm
 2003-09-29 17:09
#58340 #58340
User since
2003-09-22
10 Artikel
BenutzerIn
[Homepage] [default_avatar]
OK, fuer alle die es interessiert, so mach ich das nun:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#! /usr/bin/perl -w

use strict;
use IO::Select;

my $sel = new IO::Select( "STDIN");

if(!$sel->can_read( 3 )) {
    die "STDIN ist leer\n";
}

print "Hier geht das Programm weiter..\n";


by & und Danke nochmal fuer den Hinweis auf IO::Select, Martin
<< >> 10 Einträge, 1 Seite



View all threads created 2003-09-29 14:19.