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