Neblokovane cteni ze STDIN
Vlasta Šeliga
xseliga na fi.muni.cz
Sobota Květen 17 21:36:28 MEST 2003
Dobry den,
potreboval bych precist jeden znak ze STDIN - tak aby se getc(), read()
pouze podival jestli neco neceka a pripadne vratil prvni znak na vstupu.
A v optimalnim pripade, po precteni prvniho znaku, vyprazdil celou frontu.
Potrebuju totiz vypisovat, napr co sekundu, aktualizovana data a
pripadne reagovat na nejakou uzivatelovu akci. (Melo by to cely vypadat
trosku jako 'top' v unixu.)
Zatim jsem se dostal pouze do faze, kdy mi moje cteni ze stdin sice
neblokuje cyklus, ale zaroven nic neprecte ;-(, viz priklad:
#!/usr/bin/perl
use Fcntl;
$BSD = -f '/vmunix';
if ($BSD) {
system "stty cbreak /dev/tty 2>&1";
}
else {
system "stty", '-icanon',
system "stty", 'eol', "\001";
}
$flags = fcntl(STDIN, F_GETFL, 0);
#$key = getc(); #po odkomentovani se v cyklu vypise prvni vlozeny radek
a pak nic...
$ret = fcntl( STDIN, F_SETFL, $flags|O_NONBLOCK ); die "can't set STDIN
non-blocking: $!" unless defined $ret;
while(1){
read( STDIN, $key, 1 );
print "Test \$key: $key \n";
sleep 1;
}
if ($BSD) {
system "stty -cbreak /dev/tty 2>&1";
}
else {
system "stty", 'icanon';
system "stty", 'eol', '^@'; # ascii null
}
print "\n";
Další informace o konferenci Perl