Fuer was ist hier STDIN nonblocking?

Fuer was ist hier STDIN nonblocking?

am 06.01.2008 17:14:10 von Peter Mairhofer

Hallo!

Ich bin gerade dabei, ein Perl-Script (droute.pl von Ozymandns, [1]) nach
Windows (ActiveState) zu portieren.

Im Script kommt vor:

# set STDIN to nonblock
$flags='';
fcntl($infile, F_GETFL, $flags) or die "1\n";
$flags |= O_NONBLOCK;
fcntl($infile, F_SETFL, $flags) or die "2\n";

F_GETFL und O_NONBLOCK gibt es unter ActiveState jedoch nicht.


Soweit ich das sehe machen diese Anweisungen STDIN nonblocking, d.h. jede
Leseaktion von STDIN soll nicht blockierend sein.

Die einzige Stelle jedoch, wo von STDIN gelesen wird, ist innerhalb eines
Threads:

$read_queue = Thread::Queue->new;
$read_thread = threads->new(\&reader);
sub reader {
while(1){
if($read_queue->pending < 32){
my $data="";
$error=sysread(STDIN, $data, 110);
if(length($data)){ $read_queue->enqueue($data);}
if(undef $error) {exit(1);}
}
usleep(50 * 1000);
}
}

Hier verstehe ich nicht, wieso das deswegen non-blocking sein muss, denn
es lauft ja sowieso in einem eigenen Thread ab! Mehr noch, in meinen
Augen ergibt es sogar eine viel bessere Performance, wenn sysread() auf
stdin blockiert!

Kann mir jemand sagen, wieso in dem Script (wie gesagt auf [1] als
droute.pl drin) das STDIN auf non-Blocking gesetzt wird?

Und fuer was ist eigentlich das usleep hier gut?

Danke und lg,
Peter



[1] http://www.doxpara.com/ozymandns_src_0.1.tgz